正如@ninjalj所說,如果你不使用-D skip
,grep
會嘗試讀取你所有的設備文件,套接字文件和FIFO文件。特別是在Linux系統(和許多Unix系統)上,它會嘗試讀取/dev/zero
,這似乎是無限長的。
你會等待一段時間。
如果您正在查找系統日誌,從/var/log
開始可能是最好的方法。
如果你正在尋找的東西,真的可以在文件系統中的任何地方,你可以做這樣的事情:
find/-xdev -type f -print0 | xargs -0 grep -H pattern
的-xdev
參數find
告訴它留一個單一的文件系統中;這將避免/proc
和/dev
(以及任何已安裝的文件系統)。 -type f
將搜索限制爲普通文件。-print0
打印由空字符而不是換行符分隔的文件名;這避免了在名稱中具有空格或其他有趣字符的文件的問題。
xargs
從其標準輸入中讀取文件名(或其他)的列表,並在列表中的所有內容上調用指定的命令。 -0
選項與find
的-print0
一起使用。
-H
選項指示grep
指示它將每個匹配與文件名前綴對齊。默認情況下,grep
只有在其命令行上有兩個或更多文件名時纔會執行此操作。由於xargs
將其參數分成批次,所以最後一批可能只有一個文件,這會給你不一致的結果。
考慮使用find ... -name '*.log'
限制搜索到的文件與.log
結尾的名稱(假設你的日誌文件有這樣的名字),和/或使用grep -I ...
跳過二進制文件。
請注意,所有這些都取決於GNU特有的功能。其中一些選項可能不適用於MacOS(基於BSD)或其他Unix系統。請查閱您的本地文檔,並考慮安裝GNU findutils(用於find
和xargs
)和/或GNU grep。
在嘗試這些之前,請使用df
來查看根文件系統有多大。我的目前268千兆字節;搜索它可能需要幾個小時。花費幾分鐘(a)限制你搜索的文件和(b)確保命令是正確的將是非常值得你花費的時間。
grep不掛起,你的-r表示遞歸系統上的所有文件。那幾千兆字節?另外,所有NFS掛載的文件都以網絡連接速度進行處理,而不是直接連接到CPU的磁盤上的本地文件。這將需要很長時間。祝你好運。 – shellter