2013-03-08 101 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 
相關問題