2014-11-04 50 views
4

我知道我可以搜索字符串:unix命令行...如何grep並只顯示包含字符串的文件名?

grep -n -d recurse 'snoopy' * 

,然後顯示一個包含該字符串,像每一個文件名,例如:

file/name.txt:23 some snoopy here 
file/name2.txt:59 another snoopy there 
file/name2.txt:343 some more snoopy 
etc... 

的問題是,有許多事件,該名單是巨大的。我如何讓它只顯示包含字符串的實際文件名,沒有重複且沒有發生?

只有像:

file/name1.txt 
file/name52.txt 
file/name28293.txt 

非常感謝任何幫助:)

+2

您使用'-l'參數。 – 2014-11-04 21:07:03

回答

11

-l標誌(或者,在這兩個BSD和GNU grep--files-with-matches)你想要做什麼。

the POSIX spec

寫入僅含有選定的行到標準輸出的文件的名稱。每個搜索的文件都應寫入一次路徑名。如果搜索到標準輸入,則應在POSIX語言環境中寫入「(標準輸入)」的路徑名。在其他語言環境中,「標準輸入」可能會被這些語言環境中更適合的內容替代。

BSD和GNU都明確保證這樣會更有效率。 (Older BSD版本說「... grep將只搜索一個文件,直到找到一個匹配,使搜索可能更便宜,newer BSDGNU說」掃描將停止在第一場比賽「。)如果你不知道哪個grep你有和它有哪些選項,只需在shell中鍵入man grep,你應該得到該manpage。

+1

'-l'選項也在第七版UNIX中,因此它在任何地方都可用。 – 2014-11-04 21:17:58

+0

@JonathanLeffler:'busybox'和其他類似的all-in-one-micro-userland中的'grep'是否有'-l'?我正在嘗試查找文檔,但是每臺'busybox'機器都有內置禁用,並且'/ bin/grep'或'/ usr/bin/grep'是GNU版本... – abarnert 2014-11-04 21:21:23

+0

準確答案:我不知道。然而,聲稱是'grep'的內置替代品,它幾乎必須支持'-l'。它作爲一個單獨的可執行文件的一個原因是''grep'中可能有太多的代碼。如果它包含多個正則表達式包(PCRE以及傾向於包含的各種其他包),那就更是如此。 – 2014-11-04 21:24:18

相關問題