这是一个可以正常工作的命令:
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
和大多数其他正确的命令/程序一样,接受任意数量的参数。(例如比较ls
、rm
和)echo
如果您认为为每个文件启动一个新进程是绝对必要的,请使用xargs -n 1
仅向每个命令传递1
参数。这样您就可以模仿这样的低效方法:
find ... | xargs -n 1 stat -c "Blah: %a"
(在一台慢速计算机上的大型文件系统上尝试一下并计算差异!)