8

我使用 find 命令,例如:

find . -name "*.log" -exec grep "running" {} \;

为什么 find 的命令需要{},一个空白和\

4

4 回答 4

14

这是因为-exec参数:the{}是要传递给命令的文件的占位符。

分号 ( ;)find表示-exec参数列表已经结束,但由于;它也是一个 shell 运算符,因此您需要对其进行转义以使其到达find\;

-exec像这样工作:对于找到的每个文件,-exec执行(命令)之后的第一个参数,并且直到 的所有参数;都作为参数传递给命令。然后{}由 . 找到的当前文件名替换find.

于 2012-09-14T08:17:36.583 回答
2

{}是路径的占位符,find替换为实际找到的路径。

\;终止 find 的exec参数。没有\shell 会将其视为 shell 语句终止符,因此需要引用它\以便 shell 将其传递;给 find。

我会说这;find exec命令终结者的不幸选择。

请注意,{} \;序列可以替换为{} +

   -exec command {} +
          This variant of the -exec action runs the specified  command  on
          the  selected  files, but the command line is built by appending
          each selected file name at the end; the total number of  invoca‐
          tions  of  the  command  will  be  much  less than the number of
          matched files.  The command line is built in much the  same  way
          that  xargs builds its command lines.  Only one instance of `{}'
          is allowed within the command.  The command is executed  in  the
          starting directory.
于 2012-09-14T08:18:00.647 回答
1

只需阅读手册页

-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.  See the EXAMPLES sec‐
          tion for examples of the use of the -exec option.  The specified
          command is run once for each matched file.  The command is  exe‐
          cuted  in  the starting directory.   There are unavoidable secu‐
          rity problems surrounding use of the -exec  action;  you  should
          use the -execdir option instead.
于 2012-09-14T08:22:16.910 回答
0

反斜杠是一种避免分号被误解的转义。大括号是 find 输出的完整路径的占位符。

于 2012-09-14T08:22:31.037 回答