2016-12-30 102 views
7

我有超過100,000個文件的目錄。我想知道是否字符串"str1"作爲任何這些文件的內容的一部分存在。grep - 讀取的文件數量有限

命令: grep -l 'str1' *需要太長時間才能讀取所有文件。

如何找到grep停止閱讀任何進一步的文件,如果它發現匹配?任何一班?

注意:我試過grep -l 'str1' * | head,但是這個命令的耗時與上一次相同。

+0

該命令是否在少量文件的目錄中工作? –

+0

也許,已經在這裏回答:http://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop –

+0

'頭-1'將做伎倆 –

回答

5

在您的命令args中命名100,000個文件名會導致問題。它可能超過了shell命令行的大小。

但你沒有,如果你使用遞歸的選項與目錄中的文件是(這是.,如果你要搜索當前目錄中的文件)的只是名字來命名的所有文件:

grep -l -r 'str1' . | head -1 
+0

除了'-r'不是非常標準的... –

+0

對於一些額外的表現,我會在'LC_ALL =「C」grep -m1 -l -r'str1'中折騰。 | head -1' – bishop

+2

@gniourf_gniourf,OP的問題被標記爲[tag:linux],所以我認爲假設他們使用GNU grep是安全的。 –

3

使用,以便grep在找到文件中的第一個匹配項後停止。這對於大型文本文件非常有效。

grep -m 1 str1 * /dev/null | head -1 

如果有一個文件,那麼上面的/ dev/null將確保grep在輸出中打印出文件名。

如果你想在任何文件中找到的第一個匹配後停止:當你有大量的文件目錄

for file in *; do 
    if grep -q -m 1 str1 "$file"; then 
    echo "$file" 
    break 
    fi 
done 

for循環也節省您從too many arguments問題。

+0

非常好。我希望找到一個班輪,但是這些言論將會做到。 – user2070775

+1

請注意,OP已經在使用'-l',它使第一次匹配後'grep'停止。 –

+1

'*'中的文件將永遠不會受到「太多爭論」的影響,這是一個解決方法。例如,參見:http://www.in-ulm.de/~mascheck/various/argmax/ –