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

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

这是一个可以正常工作的命令:

echo Blah: `stat -c %a .`

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

答案1

最好的方法是使用位置参数$()首选用于命令替换反引号,因为它更具可读性(不会与单引号混淆)并且可以轻松嵌套而不必进行大量转义。

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

下划线是 的占位符$0

答案2

做什么的?

find ... -printf 'Blah: %m\n'

bash -c或者如果你确实需要的话使用:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;

答案3

据我所知,使用它们的唯一方法是将它们放在 bash 脚本文件中,并在 -exec 中使用该脚本。同样的事情$()

答案4

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

我更喜欢这样:

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

find输出找到的所有内容的列表,xargs读取 上的参数列表stdin,并使用命令行上的这些参数执行其参数,构建尽可能长的命令行。它之所以有效,是因为stat和大多数其他正确的命令/程序一样,接受任意数量的参数。(例如比较lsrm和)echo

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

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

(在一台慢速计算机上的大型文件系统上尝试一下并计算差异!)

相关内容