这是一个正常工作的命令:
echo Blah: `stat -c %a .`
是否有可能find -exec为每个find的文件执行同样的事情,用{}代替. ?
最好的方法是使用位置参数。 并且$()是命令replace的首选 ,因为它更具可读性(不会与单引号混淆),并且可以轻松嵌套,而不必进行大量转义。
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
下划线是$0的占位符。
做什么的?
find ... -printf 'Blah: %m\n'
或者使用bash -c如果你真的需要:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
使用它们的唯一方法(AFAIK)是将它们放在一个bash脚本文件中,并在-exec中使用脚本。 同样的事情与$()
别忘了xargs ! 你的例子会为每个find的文件调用一个新的shell进程。
我宁愿这样做:
find ... | xargs stat -c "Blah: %a"
find输出的列表, xargs读取stdin上的参数列表,并在命令行上使用这些参数执行它的参数,尽可能长的build立命令行。 它的工作原理是, stat和大多数其他适当的命令/程序一样,可以使用任意数量的参数。 (比较ls , rm和echo )
如果您觉得为每个文件启动一个新进程是绝对必要的,则使用xargs -n 1仅将1parameter passing给每个命令。 这样,你可以模仿这种效率低下的方法:
find ... | xargs -n 1 stat -c "Blah: %a"
(在慢速计算机上的大文件系统上试一试,并分析差异!)