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

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

以下命令运行正常:

find . -iname \*.7z -exec ls {} -al \;

但当我改为\;\+那就是:

find . -iname \*.7z -exec ls {} -al \+

我收到错误报告:

missing argument to `-exec'

{}当我改变的位置时我发现:

find . -iname \*.7z -exec ls -al {} \+

上述命令可以正常工作。

我对此感到困惑。

答案1

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

这就是你的答案……但它确实提出了一个额外的问题:为什么首先存在限制,这有点模糊。

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

在一次调用中接受可变数量的文件名参数的命令,为了产生与为每个文件名执行一次命令相同的效果,通常接受它们作为尾随参数。当然,也有例外,如cp目录mv目标(尽管您可以传递以使它们与 一起工作)。这也更容易推理,因为当您写后跟文件名时,感觉就像是您正在运行的“命令”来操作这些命名文件,但是当您写后跟文件名,后跟 时,感觉并不完全是这样。-t dir+ls -lls -lls-l

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

由于您正在运行ls,因此您可以考虑使用find-ls操作而不是-exec。还请注意,您不需要引用+,因为与 不同;,shell 不会对+字符进行特殊处理。

相关内容