首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么-exec只在某些位置接受{}?

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

Ask Ubuntu用户
提问于 2019-08-26 15:43:23
回答 1查看 335关注 0票数 3

以下命令运行良好:

代码语言:javascript
复制
find . -iname \*.7z -exec ls {} -al \;

但是,当我将\;更改为\+时,即:

代码语言:javascript
复制
find . -iname \*.7z -exec ls {} -al \+

我收到了错误报告:

代码语言:javascript
复制
missing argument to `-exec'

我发现当我改变{}'s的立场时:

代码语言:javascript
复制
find . -iname \*.7z -exec ls -al {} \+

上面的命令可以正常工作。

我对此感到困惑。

EN

回答 1

Ask Ubuntu用户

回答已采纳

发布于 2019-08-26 16:01:52

+形式的-exec总是将参数放在命令的末尾。因此,表示参数的{}必须紧接在+之前。这与;-exec表单不同,该表单在找到的每个文件中运行一个命令,并在任何{}出现的地方使用文件名。

这就是你的答案..。但它确实提出了另一个问题,即为什么这一限制一开始就存在,这一点有点模糊。

使用+*时,** -exec操作将尽可能少次地运行您的命令,传递尽可能多的文件名来代替{}**。*,特别是如果可能找到了许多文件,则这种形式的-exec只适合用于行为相同的命令--或者至少以与您想要的方式一致的方式--当文件名被拆分到命令的多个调用中时,就像当所有文件名都出现在单个调用中时一样。

在一次调用中接受可变数量的文件名参数的命令,为了产生相同的效果,就像对每个文件名执行一次命令一样,通常将它们接受为尾随参数。当然,cpmv等目录目标也有例外(尽管您可以通过-t dir来使它们与+一起工作)。这也比较容易理解,因为当您编写ls -l和文件名时,感觉ls -l是对那些命名文件进行操作的“命令”,但是当您编写ls、后跟文件名和-l时,感觉就不那么简单了。

至于该做什么,简单地将-l这样的选项放在{}之前是很好的方法。这还有其他优点:虽然在像Ubuntu这样的GNU/Linux系统上不像在其他类似Unix的操作系统上那么常见,但在非选项参数出现之后,有些命令不接受选项。(详见getopt(3)。)

既然您正在运行ls__,您可能会考虑使用find_‘S -ls动作而不是-exec__。还请注意,您不需要引用+__,因为与;__不同,shell并不特别对待+字符。

票数 5
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1168676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档