egrep输出中的文件名“{}”是什么意思?
我使用的是ubuntu debian 12.04,我运行了一个find命令向我所有的python文件中添加了一些内容: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
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' {} +
值得注意的差异:
- 重定向在以
启动的shell中调用;因此,在解析单个文件名之后,将有一个shell来表示对它的尊重exec sh
,这比-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' {} +
值得注意的差异:
- 重定向在以
启动的shell中调用;因此,在解析单个文件名之后,将有一个shell来表示对它的尊重exec sh
,这比-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
替换