find -exec 应该以 \; 或 + 结尾?

find -exec 应该以 \; 或 + 结尾?

根据man find-exec 选项必须以 结尾;

表达式必须以分号(“;”)终止。

但是当我find-grep在 Emacs 中使用时,表达式以 结尾+。我应该使用哪一个?这两个表达式有什么区别吗?

答案1

这是来自 GNU 手册的内容find

   -exec command ;
          Execute command; true if 0 status is returned.
          All following arguments to find are  taken  to
          be  arguments to the command until an argument
          consisting of `;'

被我切断了。但我们还有:

   -exec command {} +
          This variant of  the  -exec  action  runs  the
          specified  command  on the selected files, but
          the command line is built  by  appending  each
          selected  file name at the end; the total num‐
          ber of invocations of the command will be much
          less  than  the  number of matched files.  The
          command line is built in  much  the  same  way
          that xargs builds its command lines.

被我打断了。

因此,;+做不同的事情。以下代码示例来演示:

$ mkdir test
$ touch test/{a,b}
$ find test -exec echo foo {} \;
foo test
foo test/a
foo test/b
$ find test -exec echo foo {} +
foo test test/a test/b

+仅生成一次调用,其中所有匹配的文件作为参数列表(实际上它的行为类似于xargs)。;对每个匹配的文件执行一次命令(;需要在 shell 中进行转义;因此前面有\)。

请注意,某些版本find缺少该+选项,但 GNU 版本很可能安装在非嵌入式 Linux 上。

答案2

总结:

在 -exec 中使用 + 与 -exec 相同,但每次调用实用程序时,都会{}用尽可能多的路径名替换


我的电脑上的内容稍长一些man find

   -exec 实用程序 [参数...];
             如果名为 utility 的程序返回零值,则为 True
             作为其退出状态。可以传递可选参数
             到实用程序。
             表达式必须以分号结束。如果你
             从 shell 调用 find 可能需要引用
             如果 shell 将其视为控件,则使用分号
             运算符。如果字符串“{}”出现在
             实用程序名称或由路径名替换的参数
             当前文件。
             实用程序将从 find 所在的目录中执行
             执行。效用和参数不受进一步
             外壳图案和结构的扩展。


     -exec 实用程序 [参数 ...] {} +
             与 -exec 相同,只是 `{}` 被替换为尽可能多的
             每次调用实用程序时尽可能使用路径名。  
             此行为与 xargs(1) 的行为类似。

注意第二段。不要在第一段解释 -exec 之后就停止阅读。

相关内容