2013-03-08 109 views
110

使用xenserver,我想对目录中的每个文件执行命令,从命令输出中删除一些内容并将其附加到文件中。如何对目录中的所有文件执行grep操作

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

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

回答

58

在Linux中,我通常使用这个命令中的DIR

grep -rni "string" * 

其中递归用grep特定文本,

R =递归即,当前目录内搜索子目录
N =将行号打印到标准输出
i =不区分大小写的搜索

132

grep $PATTERN *就足够了。默认情况下,grep会跳过所有子目录。但是,如果你想通过他们grep,grep -r $PATTERN *就是这样。

+22

的 “grep -r $格局。”足够了。对于递归grep,您不需要指定所有文件 – Cougar 2013-10-02 06:26:11

+1

如何包含多个扩展?例如。 “\ *。cpp”,“\ *。h”? – 2016-11-08 16:05:53

+1

@TomášZato,只提供所有文件模式而不是*:'grep $ PATTERN * .cpp * .h'。如果你需要更多关于什么文件应该被grepped的特定规则,使用'find'命令(检查Rob的答案)。 – umi 2016-11-27 13:22:43

21

使用find。说真的,这是最好的方式,因为这样你可以真正看到哪些文件对操作:

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

注意,-H是Mac特有的,它显示在结果的文件名。

+5

如果您决定使用find,请通过'xargs'而不是'-exec'管道输出,这会* *更快,因为'-exec'会为每个grep生成一个新进程,并且开销会变得很大大量的文件。有关文件名中空格的标准警告适用于'xargs'。 – 2015-02-04 19:50:54

+2

这看起来像什么?我总是忘记'xargs'语法。 – 2015-05-14 19:20:00

+1

@BrianPeterson它会是这样的:'发现。 -iname“* .sql”-print0 | xargs -0 grep“slow”' – MediaVince 2016-08-18 08:41:41

2

如果你想要做的多条命令,你可以使用:

for I in `ls *.sql` 
do 
    grep "foo" $I >> foo.log 
    grep "bar" $I >> bar.log 
done 
相关问题