數千個文件中的 Grep
我有包含 cca 26 000 個文件的目錄,我需要在所有這些文件中使用 grep。問題是,我需要盡可能快地使用它,因此製作腳本並不理想,其中 grep 將從 find 命令中獲取一個文件的名稱並將匹配項寫入文件。在“參數列表太長”問題之前,cca 花了 2 分鐘 grep 所有這些文件。任何想法如何做到這一點?編輯:有一個腳本一直在製作新文件,因此不可能將所有文件放到不同的目錄中。
與
find
:cd /the/dir find . -type f -exec grep pattern {} +
(
-type f
是只在正常文件中搜尋(也不包括符號連結,即使它們指向正常文件)。如果你想在除目錄之外的任何類型的文件中搜尋(但要注意有一些類型的文件,如 fifos 或 /dev/zero您通常不想閱讀),替換-type f
為特定於 GNU 的! -xtype d
(在符號連結解析後-xtype d
匹配目錄類型的文件))。使用 GNU
grep
:grep -r pattern /the/dir
(但請注意,除非您有最新版本的 GNU grep,否則在進入目錄時將遵循符號連結)。
-D read
除非您添加選項,否則不會搜尋非正常文件。不過,最新版本的 GNUgrep
仍然不會在符號連結中搜尋。非常舊的 GNU 版本
find
不支持標準{} +
語法,但您可以使用非標準的:cd /the/dir && find . -type f -print0 | xargs -r0 grep pattern
性能可能受 I/O 限制。那就是進行搜尋的時間將是從儲存中讀取所有數據所需的時間。
如果數據位於冗餘磁碟陣列上,一次讀取多個文件可能會提高性能(否則可能會降低性能)。如果性能不受 I/O 限制(例如因為所有數據都在記憶體中),並且您有多個 CPU,並發
greps
可能也會有所幫助。您可以使用 GNUxargs
的-P
選項來做到這一點。例如,如果數據在具有 3 個驅動器的 RAID1 陣列上,或者如果數據在記憶體中並且您有 3 個 CPU 可以騰出時間:
cd /the/dir && find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(這裡
-n1000
用於每 1000 個文件生成一個新grep
文件,一次最多並行執行 3 個)。但是請注意,如果 的輸出
grep
被重定向,您最終會得到來自 3 個grep
程序的嚴重交錯輸出,在這種情況下,您可能希望將其執行為:find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(在最近的 GNU 或 FreeBSD 系統上)或使用
--line-buffered
GNU 選項grep
。如果
pattern
是固定字元串,添加-F
選項可以改善問題。如果不是多字節字元數據,或者為了匹配該模式,數據是否是多字節字元都沒有關係,那麼:
cd /the/dir && LC_ALL=C grep -r pattern .
可以顯著提高性能。
如果您最終經常進行此類搜尋,那麼您可能希望使用眾多搜尋引擎之一來索引您的數據。