egrep输出中的文件名“{}”是什么意思?

egrep输出中的文件名“{}”是什么意思?,grep,echo,Grep,Echo,我使用的是ubuntu debian 12.04,我运行了一个find命令向我所有的python文件中添加了一些内容: find . iname "*.py" -exec echo "import os" >> {} \; 该命令运行时没有错误,我希望验证结果,因此我退出所有文件: egrep -in "import os" * 我得到的结果如下所示: {}:35:import os {}:36:import os {}:37:import os {}:38:import os

我使用的是ubuntu debian 12.04,我运行了一个find命令向我所有的python文件中添加了一些内容:

find . iname "*.py" -exec echo "import os" >> {} \;
该命令运行时没有错误,我希望验证结果,因此我退出所有文件:

egrep -in "import os" *
我得到的结果如下所示:

{}:35:import os
{}:36:import os
{}:37:import os
{}:38:import os
{}:39:import os
find . -iname '*.py' -exec sh -c 'for f; do echo "import os" >>"$f"; done' {} +
…由于某种原因,数字一直到51。这是什么意思

多谢各位

您的第一个命令:

find . iname "*.py" -exec echo "import os" >> {} \; 
正在查找以.py结尾的文件,并将字符串“import os”放入名为
{}
的文件中。大概有51场比赛

因此,当您运行它时,
*
匹配所有文件,包括名为
{}
的文件。使用
{}:35:import os
它告诉您“在文件{}的第35行,有您要查找的字符串”

您的第一个命令:

find . iname "*.py" -exec echo "import os" >> {} \; 
正在查找以.py结尾的文件,并将字符串“import os”放入名为
{}
的文件中。大概有51场比赛

因此,当您运行它时,
*
匹配所有文件,包括名为
{}
的文件。使用
{}:35:import os
它告诉您“在文件{}的第35行,有您要查找的字符串”

此命令:

find . iname "*.py" -exec echo "import os" >> {} \;
…创建一个名为
{}
的文件(在bash和其他shell中,它们在头和尾以外的位置执行重定向——这是POSIX sh标准不需要的扩展名)。它不修改通过查找找到的文件。(这是因为
>
充当启动
find
的shell的命令;它没有修改
-exec
--的行为,即使修改了,
-exec
也直接使用
execve()
来调用给定的命令;它不会通过shell启动该命令,因此它不支持诸如重定向之类的shell构造,因此您可以将literal
>
作为参数传递给未实现此扩展的任何shell上的
echo
,但仍不会对找到的单个文件执行重定向)


现在,如果您确实想修改由
find
找到的文件,您可以这样做:

{}:35:import os
{}:36:import os
{}:37:import os
{}:38:import os
{}:39:import os
find . -iname '*.py' -exec sh -c 'for f; do echo "import os" >>"$f"; done' {} +
值得注意的差异:

  • 重定向在以
    exec sh
    启动的shell中调用;因此,在解析单个文件名之后,将有一个shell来表示对它的尊重
  • -exec。。。使用{}+
    ,这比
    -exec>更有效。。。{} ;(前者运行尽可能少的子命令;后者为每个找到的文件运行一个子命令)
此命令:

find . iname "*.py" -exec echo "import os" >> {} \;
…创建一个名为
{}
的文件(在bash和其他shell中,它们在头和尾以外的位置执行重定向——这是POSIX sh标准不需要的扩展名)。它不修改通过查找找到的文件。(这是因为
>
充当启动
find
的shell的命令;它没有修改
-exec
--的行为,即使修改了,
-exec
也直接使用
execve()
来调用给定的命令;它不会通过shell启动该命令,因此它不支持诸如重定向之类的shell构造,因此您可以将literal
>
作为参数传递给未实现此扩展的任何shell上的
echo
,但仍不会对找到的单个文件执行重定向)


现在,如果您确实想修改由
find
找到的文件,您可以这样做:

{}:35:import os
{}:36:import os
{}:37:import os
{}:38:import os
{}:39:import os
find . -iname '*.py' -exec sh -c 'for f; do echo "import os" >>"$f"; done' {} +
值得注意的差异:

  • 重定向在以
    exec sh
    启动的shell中调用;因此,在解析单个文件名之后,将有一个shell来表示对它的尊重
  • -exec。。。使用{}+
    ,这比
    -exec>更有效。。。{} ;(前者运行尽可能少的子命令;后者为每个找到的文件运行一个子命令)

{}
是一个占位符,用与给定条件匹配的文件名替换为
find
,在这种情况下,
{}
替换为与模式
“*.py”
匹配的文件名

但是,您的
find
命令实际上并没有这样做,因为
>{}
实际上不是
-exec
块的一部分,而是被shell解释为整个
find
命令的重定向,所以
{}
永远不会被具有正确文件名的
find
替换,而是重定向到名为
{}
的文件中。为了让事情更清楚,您实际执行的命令如下:

find . iname "*.py" -exec echo "import os" \; >> {}
意味着对于每个
*.py
文件,您将包含“导入操作系统”的行添加到名为
{}
的文件中。
grep
的输出只是
filename:linenumber:matched_line
,因此您会在其中得到一个
{}
,因为这是文件名

如果您想知道
\幸存下来,以及您没有获得以下许可的原因:

find: missing argument to `-exec'
shell实际上并不关心重定向在命令行中的何处发生:

echo 1 2 3 4 5 6 7 > foo
同:

echo 1 2 > foo 3 4 5 6 7
每次都会给你这个:

$ cat foo
1 2 3 4 5 6 7

同样值得一提的是,append操作符是一个append操作符,因此,即使您修复了添加到Python文件末尾的命令,而导入操作系统可能也应该放在文件的顶部。

{}
是一个占位符,它被替换为
find
,文件名与给定条件匹配,在这种情况下,
{}
将替换为与模式
“*.py”
匹配的文件名

但是,您的
find
命令实际上并没有这样做,因为
>{}
实际上不是
-exec
块的一部分,而是被shell解释为整个
find
命令的重定向,所以
{}
永远不会被
find
替换