如何对目录中的所有文件执行grep操作


218

使用xenserver,我想对目录中的每个文件执行一条命令,从命令输出中提取一些内容并将其附加到文件中。

我很清楚我要使用的命令以及如何根据需要grep输出字符串。

但是我不清楚的是如何在每个文件上执行此命令,然后转到下一个,直到找不到更多文件。

Answers:


228

grep $PATTERN *就足够了。默认情况下,grep会跳过所有子目录。但是,如果要通过它们进行grep操作,grep -r $PATTERN *就是这种情况。


37
“ grep -r $ PATTERN。” 足够了。递归的grep你不需要指定的所有文件
美洲狮

1
如何包含多个扩展名?例如。“ * .cpp”,“ *。h”?
托马什Zato -恢复莫妮卡

1
@TomášZato,只需提供所有文件模式而不是*:即可grep $PATTERN *.cpp *.h。如果您需要更详细的规则来确定应删除哪些文件,请使用find命令(检查Rob的答案)。
umi

@umi如果我运行grep -r x .结果来自所有扩展名的所有文件。如果我跑步grep -r x *.scss,我将没有结果。
克里斯(Chris)

1
@Chris可能您*.scss当前目录中没有文件,但是在子目录的更深处,因此grep不会查找您想要的所有文件。您应该使用--includeoption告诉grep递归查找与特定模式匹配的文件:(grep -r x --include '*.scss' . 请注意引号,它们可以防止外壳扩展模式)。或只是使用find(请参阅Rob的答案)。
umi

168

在Linux中,我通常使用此命令对目录中的特定文本进行递归grep

grep -rni "string" *

哪里,

r =递归,即在当前目录中搜索子目录
n =将行号打印到stdout
i =不区分大小写的搜索


32

使用查找。认真地说,这是最好的方法,因为这样您便可以真正看到它正在运行的文件:

find . -name "*.sql" -exec grep -H "slow" {} \;

注意,-H是mac特定的,它在结果中显示文件名。


7
如果你决定使用发现,通过管道输出xargs,而不是使用-exec,这将是快,因为-exec产卵每个grep的一个新的进程,以及开销变得显著有大量的文件。有关文件名中空格的标准警告适用于xargs
巴顿·奇滕登

2
这到底是什么样的?我总是忘记xargs语法。
Brian Peterson

3
@BrianPeterson会是这样的:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

要搜索所有子目录(但仅搜索特定文件类型),请使用grep和--include

例如,在当前目录中递归搜索* .yml和* .yaml中的文本:

grep "text to search" -r . --include=*.{yml,yaml}

1

如果要执行多个命令,可以使用:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.