为什么'find -exec cmd {} +'需要以'{} +'结尾?

为什么'find -exec cmd {} +'需要以'{} +'结尾?

-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 {} +也可以预期)将更加困难。

相关内容