find 命令中的“{} \;”是什么意思?

find 命令中的“{} \;”是什么意思?

有时我会看到以下命令:

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 {} \;执行命令,因此,等等。catfindcat file1.txtcat file2.txt

相关内容