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