-exec {} \;
前言:我理解&之间的区别-exec {} +
。我也没有问题像这样,我只是好奇 的语义find
。
当用 而不是结束-exec
争论时,我们+
;
需要以 结束此操作{} +
,例如:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
在这些示例中使用;
代替+
工作正常(但显然做了其他事情)。
从POSIX:
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
...只有紧跟在仅包含两个字符“”的参数后面的 <plus-sign>
{}
才能标点主表达式的末尾。 <加号> 的其他用途不应被视为特殊用途。
换句话说,当使用 时+
,命令需要以 结束{} +
。
为什么是这样?为什么只使用 the+
而不是 the ;
?起初我想也许是为了避免与包含 a 的文件名发生冲突+
,但带有 a 的文件名;
似乎工作正常?我很难相信这个限制是任意的......
答案1
这理由POSIX 规范中给出的是:
采用的语法
"-exec ... {} +"
是 IEEE PASC Interpretation 1003.2 #210 的结果。应该注意的是,这是对 ISO/IEC 9899:1999 标准的不兼容更改。例如,'-'
如果文件是常规文件,以下命令将打印名称后带有 的所有文件,'+'
否则打印 :find / -type f -exec echo {} - ';' -o -exec echo {} + ';'
该更改使此类用法无效。尽管以前的标准声明这种用法是可行的,但实际上许多人并不支持它,并且标准开发人员认为现在最好声明这是不允许的。
PASC 解释 1003.2 #210更详细地了解 的历史-exec … {} +
。在被 POSIX 采用之前,它已经存在于多个 Unix 系统中;缺陷报告追溯到SVR4(基本上没有记录)。缺陷报告证明不兼容的更改在实践中几乎没有影响:
请注意,只有紧跟在“{}”后面的“+”才被视为特殊字符。这最大限度地减少了现有使用“+”作为“-exec”参数引起问题的可能性。
尽管添加对的支持-exec … {} +
会破坏某些符合要求的应用程序(例如上面的示例),但此类应用程序的数量比-exec … {} … +
允许的要少。
也许限制{}
为最后一个参数的另一个原因是易于实现。如果{}
参数列表中的任何位置都允许 to -exec
,则find
程序必须通过复制静态参数、然后是变量部分、然后是另一个静态部分来构建命令行。这将使构建参数列表和考虑大小限制变得更加困难。难度很小,但实施者喜欢走捷径。支持多个可替代的实例{}
(如果-exec {} foo +
可行,逻辑上-exec {} foo {} +
也可以预期)将更加困难。