前言:我了解-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>将标点主表达式的末尾。<plus-sign>的其他用途不应视为特殊用途。
换句话说,使用时+
,该命令需要与结束{} +
。
为什么是这样?为什么只用+
而不用;
?起初,我想也许是为了避免与包含的文件名发生冲突+
,但;
看起来似乎可以正常工作的文件名?我发现很难相信这个限制是任意的...
POSIX规范中给出的基本原理是:
所
"-exec ... {} +"
采用的语法是IEEE PASC解释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 … {} … +
允许的应用程序相比,这些应用程序要少。
限制{}
成为最后一个论点的另一个原因可能是易于实施。如果{}
允许在参数列表中的任何位置使用-exec
,则find
程序必须通过以下方式构建命令行:复制静态参数,然后复制变量部分,然后复制另一个静态部分。这将使构造参数列表和解释大小限制变得更加困难。难度很小,但是实现者喜欢偷工减料。支持多个可替换实例{}
(如果-exec {} foo +
可以正常工作,从逻辑上也可以这样-exec {} foo {} +
)将变得非常困难。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句