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
)。