是否可以为找到的每个文件获取“ find -exec”扩展反引号?


9

这是一个运行良好的命令:

echo Blah: `stat -c %a .`

是否有可能对找到find -exec的每个文件执行相同的操作,而{}不是.


1
反引号不能在那里工作,因为它们find甚至在执行之前就被评估过一次,并且结果被用作查找的静态参数。
斯文

Answers:


10

最好的方法是使用位置参数。并且$()优选的用于命令替换OVE反引号,因为它更可读的(不与单引号混淆)并且可以容易地嵌套,而不必做逸出的很多。

find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;

下划线是的占位符$0




0

别忘了xargs!您的示例将为找到的每个文件调用一个新的Shell进程。

我更喜欢这样:

find ... | xargs stat -c "Blah: %a"

find输出找到的所有xargs内容的列表,读取参数列表stdin并在命令行上使用这些参数执行其参数,从而尽可能长地构建命令行。之所以起作用stat,是因为与其他大多数适当的命令/程序一样,它接受任意数量的参数。(比较lsrmecho为实例)

如果您认为绝对有必要为每个文件启动一个新进程,请使用xargs -n 1,仅将1参数传递给每个命令。这样,您可以模仿这样的低效方法:

find ... | xargs -n 1 stat -c "Blah: %a"

(在速度较慢的计算机上的大文件系统上尝试使用它,并计时差异!)


我很感谢您的努力,但是我需要那些反驳。显然,我的示例已简化,并使用echo + stat; 真正的脚本既不使用echo也不使用stat,因此将它们放到stat的格式字符串中的技巧根本没有帮助。
RomanSt 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.