我具有以下文件/目录结构:
tsunami # find .
.
./dir1
./dir1/dirinner
./dir1/dirinner/innerfile
./logs
./messages
我试图递归地查找文件,并使用查找/执行来处理它们。
找到的版本(附带busybox的)不允许使用所发现的文件名不止一次在exec命令类似讨论在这里。因此,我使用了建议的解决方案之一。所以,我重新写了这个:
find * -type f -exec echo {} +
对此:
find * -type f -exec sh -c 'echo $0' {} +
但是新版本仅找到最里面的文件,而没有找到其他文件。
这是两个的输出:
tsunami # find * -type f -exec echo {} +
dir1/dirinner/innerfile logs messages
tsunami # find * -type f -exec sh -c 'echo $0' {} +
dir1/dirinner/innerfile
我该如何解决?我需要它来查找所有文件,而不仅仅是最里面的一个。
我假设echo
只是您要进行实验的豚鼠(唯一find . -type f
可以完成文件路径的打印)。
在我的回答find . …
中find * …
,为了简单起见,我使用代替-。如果您有使用Shell Globing的理由,请继续。
您的问题是因为-exec … {} +
语法一次代替了许多路径{}
;因此,-exec sh -c 'echo $0' {} +
在sh
有很多参数的情况下,但$0
仅涉及一个参数,其余参数未使用。
使用"$@"
,就意味着"$1" "$2" "$3" …
。因为它跳过了,所以$0
您需要提供一个额外的(虚拟)参数。对于sh
我使用sh
:
find . -type f -exec sh -c 'echo "$@"' sh {} +
还要注意,如果发现一个命令行无法处理太多文件,则会运行多个sh
-s(因此多个echo
-s)。
替代-exec … {} +
使用-exec … \;
:
find . -type f -exec sh -c 'echo "$0"' {} \;
这将为sh
每个文件单独运行,这样$0
就足够了。
另一个不同之处是:大多数find
实现都要求在此{}
之前+
,但是在\;
这种情况下,{}
可能介于-exec
和之间\;
。代表着:
-exec foo {} bar +
是无效的;-exec foo {} bar \;
还可以不过,这种差异在您的特定情况下并不重要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句