2009-09-01 94 views

回答

12

在這裏,您將發送文件名(find command的輸出)作爲egrep的輸入;你實際上想要在文件的內容上運行egrep。

這裏有幾個選擇:

find . -name "*.txt" -exec egrep mystring {} \; 

甚至更​​好

find . -name "*.txt" -print0 | xargs -0 egrep mystring 

檢查find command help檢查什麼單一的論據做。
第一種方法會爲每個文件產生一個新的進程,而第二種方法會傳遞多個文件作爲egrep的參數;需要-print0和-0標誌來處理可能令人討厭的文件名(例如,即使文件名包含空格,也允許正確分隔文件名)。

+0

在第一個命令結尾處缺少'\ +'或'\;'。 – spatz

+0

這是否嘗試在mystring中查找文件名?我認爲他正在尋找其他方法。 – Kevin

+0

@spatz:謝謝你的評論,我修正了這個例子。 –

2

嘗試:

find . -name '*.txt' | xargs egrep mystring 

有兩個問題與您的版本:

首先*.txt將首先由外殼擴展,讓您在當前目錄中的文件的列表以.txt結尾,因此舉例如下:

[[email protected]:~]$ ls *.txt 
test.txt 
[[email protected]:~]$ 

你的find命令將變成find . -name test.txt。剛剛嘗試以下說明:

[[email protected]:~]$ echo find . -name *.txt 
find . -name test.txt 
[[email protected]:~]$ 

其次egrep並不需要從文件名STDIN。將它們轉換爲需要使用的參數xargs

+0

我也建議圍繞以下模式 - 名稱用引號括起來,以防止shell進行模式匹配 –

+0

我想感謝你們所有人提供這樣全面的答案。 – Tolga

1
find . -name *.txt | egrep mystring 

這不會因爲egrep工作將由find . -name *.txt這只是路徑*.txt文件生成的輸出內尋找mystring

相反,你可以使用xargs

find . -name *.txt | xargs egrep mystring 
1

你可以使用

find . -iname *.txt -exec egrep mystring \{\} \; 
1

這裏將返回的是具有與ERROR開頭的線路全部*.log文件的文件路徑的例子:

find . -name "*.log" -exec egrep -l '^ERROR' {} \; 
1

還有一個從egrep的,你可以使用

egrep -R "pattern" *.log 
+0

這不起作用。如果參數列表中提供了-R選項,則它只會遞歸到目錄中。在這種情況下,這些目錄中的所有文件都將被讀取,而不僅僅是以.log結尾的文件。如果您使用此方法取得任何成功,這是因爲在當前目錄中有以.log結尾的文件,因爲那時shell將解析* .log。 –

+0

也許用'egrep -R「模式」--include = * .log .'? – moala

1

如果只想文件名遞歸選項:

find . -type f -name '*.txt' -exec egrep -l pattern {} \; 

如果你想要的文件名和匹配:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \; 
相關問題