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

cur*_*wei 3 command-line find

以下命令工作正常:

find . -iname \*.7z -exec ls {} -al \;
Run Code Online (Sandbox Code Playgroud)

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

find . -iname \*.7z -exec ls {} -al \+
Run Code Online (Sandbox Code Playgroud)

我收到错误报告:

missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

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

find . -iname \*.7z -exec ls -al {} \+
Run Code Online (Sandbox Code Playgroud)

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

我对此感到困惑。

Eli*_*gan 5

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

这就是你的答案......但这确实提出了另一个问题:为什么会这样首先会存在

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

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

至于该怎么做,你简单地把选项放在-l前面的方法{}是好的。这还有其他优点:虽然在 Ubuntu 等 GNU/Linux 系统上比在其他一些类 Unix 操作系统上不太常见,但某些命令在出现非选项参数后不接受选项。(有关详细信息,请参阅getopt(3)。)

由于您正在运行ls,您可能会考虑使用find's -lsaction 而不是-exec. 另请注意,您不需要引用+,因为与 不同;,shell 不会+特殊对待该字符。