为什么找到需要“{}”?

时间:2012-09-14 08:13:28

标签: linux bash

我使用find命令,例如:

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

为什么查找命令需要{},空白和\

4 个答案:

答案 0 :(得分:11)

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

分号(;)告诉find -exec参数列表已结束,但由于;也是shell运算符,因此需要将其转义为它到达find\;

-exec的工作方式如下:对于找到的每个文件,执行-exec(命令)后的第一个参数,直到;的所有参数作为参数传递给命令。然后{}替换为find找到的当前文件名。

答案 1 :(得分:2)

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

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

我会说;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.

答案 2 :(得分: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.

答案 3 :(得分:0)

反斜杠是一种逃避,可以保护分号不被误解。 大括号是find输出的完整路径的占位符。