有时我会看到以下命令:
find . -name * -exec ls -a {} \;
我被要求执行此项工作。
这里是什么{} \;
意思?
答案1
如果您find
使用运行exec
,{}
则扩展为使用 找到的每个文件或目录的文件名find
(因此,ls
在您的示例中,每个找到的文件名都会作为参数 - 请注意,它会调用ls
或您为找到的每个文件指定的任何其他命令)。
分号;
结束 执行的命令exec
。需要用 进行转义\
,以便您在其中运行的 shellfind
不会将其视为自己的特殊字符,而是将其传递给find
。
看本文了解更多详细信息。
此外,还find
提供了某些优化exec cmd {} +
- 当这样运行时,find
将找到的文件附加到命令的末尾,而不是每个文件调用一次(这样,如果可能的话,该命令只运行一次)。
如果使用 运行,行为上的差异(如果不是效率上的差异)很容易被注意到ls
,例如
find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +
假设你有一些jpg
文件(足够短的路径),第一种情况下的结果是每个文件一行,而后ls
一种情况下的标准行为是按列显示文件。
答案2
来自命令手册find
页:
-exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to
the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current
file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or
quoted to protect them from expansion by the shell.
解释如下:
{}
表示“的输出find
”。如“find
找到的任何内容”。find
返回您要查找的文件的路径,对吗?所以{}
替换它;它是命令定位的每个文件的占位符find
(取自这里)。
该\;
部分基本上是在说find
“好的,我已经完成了我想要执行的命令”。
例子:
假设我在一个充满.txt
文件的目录中。然后我运行:
find . -name '*.txt' -exec cat {} \;
第一部分,find . -name *.txt
返回文件列表.txt
。第二部分,将对 找到的每个文件-exec cat {} \;
执行命令,因此,等等。cat
find
cat file1.txt
cat file2.txt