Answers:
最好的方法是使用位置参数。并且$()
是优选的用于命令替换OVE反引号,因为它更可读的(不与单引号混淆)并且可以容易地嵌套,而不必做逸出的很多。
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 {}`' \;
bash -c
或类似方法调用外壳程序。
使用它们(AFAIK)的唯一方法是将它们放在bash脚本文件中,然后在-exec中使用该脚本。同样的事情$()
别忘了xargs
!您的示例将为找到的每个文件调用一个新的Shell进程。
我更喜欢这样:
find ... | xargs stat -c "Blah: %a"
find
输出找到的所有xargs
内容的列表,读取参数列表stdin
并在命令行上使用这些参数执行其参数,从而尽可能长地构建命令行。之所以起作用stat
,是因为与其他大多数适当的命令/程序一样,它接受任意数量的参数。(比较ls
,rm
并echo
为实例)
如果您认为绝对有必要为每个文件启动一个新进程,请使用xargs -n 1
,仅将1
参数传递给每个命令。这样,您可以模仿这样的低效方法:
find ... | xargs -n 1 stat -c "Blah: %a"
(在速度较慢的计算机上的大文件系统上尝试使用它,并计时差异!)
find
甚至在执行之前就被评估过一次,并且结果被用作查找的静态参数。