为什么'find -exec cmd {} +'必须以'{} +'结尾?


11

前言:我了解-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> 将标点主表达式的末尾。<加号>的其他用途不应视为特殊用途。

换句话说,使用时+,该命令需要与结束{} +

为什么是这样?为何只用+而不用;?起初,我想也许是为了避免与包含的文件名发生冲突+,但是;看起来似乎可以正常工作的文件名?我发现很难相信这个限制是任意的...


3
FWIW,POSIX页面还说,The "-exec ... {} +" syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210在该文档中,您将找到更多详细信息,例如:Note that the "+" is only treated as special if it immediately follows "{}". This minimises the chances of causing problems with existing uses of "+" as an argument with "-exec".
don_crissti 2015年

Answers:


5

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 … {} … +允许的情况相比,这些应用程序要少得多。

限制{}成为最后一个论点的另一个原因可能是易于实施。如果{}允许在参数列表中的任何位置使用-execfind程序将必须通过复制静态参数,变量部分,然后是静态部分来构建命令行。这将使构造参数列表和解释大小限制变得更加困难。难度很小,但是实现者喜欢偷工减料。支持多个可替换的实例{}(如果-exec {} foo +可以正常工作,从逻辑上也可以这样-exec {} foo {} +)将变得非常困难。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.