以下命令工作正常:
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)
上面的命令可以正常工作。
我对此感到困惑。
+
的形式总是-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
action 而不是-exec
. 另请注意,您不需要引用+
,因为与 不同;
,shell 不会+
特殊对待该字符。