以下命令运行正常:
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 -l
ls -l
ls
-l
至于该怎么办,您简单地将选项放在-l
之前的方法{}
是好的。这还有其他优点:虽然在 Ubuntu 等 GNU/Linux 系统上不如在其他类 Unix 操作系统上常见,但有些命令在出现非选项参数后不接受选项。(见getopt(3)了解详情。
由于您正在运行ls
,因此您可以考虑使用find
的-ls
操作而不是-exec
。还请注意,您不需要引用+
,因为与 不同;
,shell 不会对+
字符进行特殊处理。