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

马丁·图尔诺伊(Martin Tournoij)

前言:我了解-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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

find -exec应该以\结尾 或+?

为什么 find -exec 在某些位置只接受 {}?

为什么find -exec mv {} ./target/ +不起作用?

Unix find -exec:为什么以下行为不同?

为什么今天我必须在命令前加上“ bundle exec”?

为什么find cmd在/ sys / class内部不起作用?

预期以cmd结尾的语句

为什么$ <filename不能从`filename`运行cmd而是$`<filename`和$ exec <filename起作用?

如何在bash函数中运行`find -exec` ---转义字符和文件意外结尾的问题

改造-基本网址必须以/结尾

为什么必须是单子?

为什么必须创建一个新的全局变量来引用“ exec”中的当前类实例?

bash中的“ exec some_cmd&”是什么意思

为什么要对它调用`find`,必须将范围设为mut?

为什么在查找元素时必须使用set.find(x)!= set.end()。

键入cmd时我必须采取什么措施来获取cmd(64位)

find / path / -exec命令'{}'+中的+是什么?

find / path / -exec命令'{}'中的{}是什么?

为什么find和exec mv不会移动所有文件?

为什么find命令的-exec选项需要反斜杠和分号?

为什么删除目录会使用find -exec生成错误消息?

查找:-exec vs xargs(又名“ find | xargs basename”为什么会中断?)

为什么回显htaccess-value以文件结尾结尾?

在猫鼬 Model.find() 和 Model.find().exec() 产生相同的结果。那么为什么要使用 Model.find().exec() 呢?

为什么必须扩展PowerMockTestCase?

为什么必须声明异常?

Android资产名称必须以.xml结尾

YAML 错误启动 API:位置 '???' 必须以 '*/' 结尾

为什么django网址以斜杠结尾?