根据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 之后就停止阅读。