我想用这个脚本做的动作是
- 读取目录中每个文件的名称(不含基)
- 对于每个文件,询问用户是否要执行操作(例如将文件移动到目录中)
执行或不执行该操作。
我对 while 循环和读取输入有疑问。我试过这个:
#!/bin/csh -f set DIR = 'pwd' find $DIR -name * -exec basename {} \; | while read filename do read -p $filename" (y or n?)"choice if ($choice = "y") then <> endif end
但我得到了错误:
find: `basename' terminated by signal 13.
我还在考虑再次使用一段时间来扩展用户的输入,直到给出是或否,但这是一个二阶问题。
bash
即使您使用-line#!
指定csh
.csh
没有read
命令,这就是您收到signal 13
错误的原因。信号 13 是 PIPE 信号,当它试图写入死管道(没有人从另一端读取的管道)时,它被发送到进程。管道已死,因为在-loop中
read
调用失败。while
它失败了,因为它在csh
.如果
csh
有一个read
命令,您的循环将获取文件名,但是您将无法知道这些文件名属于哪里(在哪个子目录中),因为您从中删除了目录路径。因此,您将无法对它们做很多事情。最简单的方法是向
find
用户提问:some-action
这将在使用路径名作为参数执行实用程序之前要求确认每个路径名。它会询问将针对给定路径名执行的完整命令行,因此这与您可能想到的不太一样。另请注意,指定
-type f
将找到所有常规文件,而您的-name '*'
测试将始终适用于所有类型的文件,包括目录。我还将.
(当前目录)用于顶级目录find
,这似乎是您想要对DIR
变量执行的操作。要手动要求用户输入每个文件,同时正确处理路径名,最简单的方法是执行类似的操作
这假定一个类似
sh
- 的 shell,并将生成sh -c
由find
. 内部 shell 脚本会询问用户是否愿意处理每个单独的路径名。n
如果用户回答以(不区分大小写)开头的单词,则将考虑下一个路径名。代码中的
"${pathname##*/}"
位等效于"$( basename "$pathname" )"
它删除$pathname
了直到并包括最后一个斜杠的所有内容。该
find
命令充当内部脚本中-loop 的一种路径名生成器,因此从不需要for
管道路径名或文件名到-loop。while
有关的: