以下命令运行良好:
find . -iname \*.7z -exec ls {} -al \;但是,当我将\;更改为\+时,即:
find . -iname \*.7z -exec ls {} -al \+我收到了错误报告:
missing argument to `-exec'我发现当我改变{}'s的立场时:
find . -iname \*.7z -exec ls -al {} \+上面的命令可以正常工作。
我对此感到困惑。
发布于 2019-08-26 16:01:52
+形式的-exec总是将参数放在命令的末尾。因此,表示参数的{}必须紧接在+之前。这与;的-exec表单不同,该表单在找到的每个文件中运行一个命令,并在任何{}出现的地方使用文件名。
这就是你的答案..。但它确实提出了另一个问题,即为什么这一限制一开始就存在,这一点有点模糊。
使用+*时,** -exec操作将尽可能少次地运行您的命令,传递尽可能多的文件名来代替{}**。*,特别是如果可能找到了许多文件,则这种形式的-exec只适合用于行为相同的命令--或者至少以与您想要的方式一致的方式--当文件名被拆分到命令的多个调用中时,就像当所有文件名都出现在单个调用中时一样。
在一次调用中接受可变数量的文件名参数的命令,为了产生相同的效果,就像对每个文件名执行一次命令一样,通常将它们接受为尾随参数。当然,cp和mv等目录目标也有例外(尽管您可以通过-t dir来使它们与+一起工作)。这也比较容易理解,因为当您编写ls -l和文件名时,感觉ls -l是对那些命名文件进行操作的“命令”,但是当您编写ls、后跟文件名和-l时,感觉就不那么简单了。
至于该做什么,简单地将-l这样的选项放在{}之前是很好的方法。这还有其他优点:虽然在像Ubuntu这样的GNU/Linux系统上不像在其他类似Unix的操作系统上那么常见,但在非选项参数出现之后,有些命令不接受选项。(详见getopt(3)。)
既然您正在运行ls__,您可能会考虑使用find_‘S -ls动作而不是-exec__。还请注意,您不需要引用+__,因为与;__不同,shell并不特别对待+字符。
https://askubuntu.com/questions/1168676
复制相似问题