Answers:
如果我对您的理解正确,这就是您想要做的:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find所有带扩展名的文件py,grep只有包含something和保存行的行output.txt。如果文件包含任何内容,它将被替换。
编辑:使用-exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
我将Chris Downs的评论纳入此处。上面的命令将导致grep执行与find发现事件一样多的次数。但是,如果将替换;为+,grep则会从find串联的输出中调用(达到一定的限制)。有关查找更多关于该主题的信息,请参见在exec中使用分号(;)与加号(+)的问题。
grep -H如果要在输出中包括文件名,请使用。
如果您要在中的所有文件中保存所有匹配的行output.txt,则您的上一条命令可以使用,但;命令末尾缺少必需的内容。
find . -name "*.py" -type f -exec grep "something" {} \; > output.txt
如果您希望每次运行都会grep产生输出到不同的文件,请运行一个Shell来计算输出文件名并执行重定向。
find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt 而且,如果您想查看grep标记行的行号,可以使用grep -n "something"
用途tee:
find . -name '*.py' | tee output.txt | xargs grep 'something'
需要说明的是,如果你有特殊字符(含空格)的任何文件xargs,并grep不会很好地工作(a file.txt将被解释为两个文件,a和file.txt)。替代方法是使用-x或-print0,但其中任何一个都会污染您的output.txt。在-x将使用\逃脱某些特殊字符,这将是output.txt。在-print0将使用一个空字节作为一个字段分隔符(这也需要xargs -0),并output.txt看起来像文本的一个长的连续线。
您如何处理(或不处理)这取决于您。
+代替\;,将显着缩短执行时间(因为它将在执行之前先处理参数直到ARG_MAX)。