Find

在整個文件系統上查找包含字元串的文件

  • February 11, 2011

我需要在整個文件系統中找到給定字元串的所有實例,因為我不記得我把它放在哪個配置文件、腳本或任何其他程序中,我需要用新的字元串更新該字元串。

我嘗試使用以下命令

`grep -nr ’needle’ / –exclude-dir=.svn | mail myaddress@example.com -s ‘對 xxx 的引用’

如果我在一個小目錄上執行這個命令,它會給我我需要的輸出形式

/path1/:nn:line containing needle
/path2/:nn:line containing needle

其中 /path1 是文件的完整路徑,nn 是包含針的行,最後一個欄位是該行的內容。

但是,當我在根目錄上執行命令時,grep 程序會在一段時間後掛起。我大約 8 小時前執行了這個腳本,即使在一個小文件系統(小於 5GB)上它也不會結束,如果我執行top或者ps程序似乎在休眠

root 24909 0.0 0.1 3772 1520 pts/1 S+ Feb10 0:15 grep -nr needle / --exclude-dir=.svn

為什麼沒有結束?有沒有更好的方法來做到這一點(這是一次性的工作,我不需要多次執行)

謝謝。

更新:我找到了一個使用 find 和 xargs 的工作解決方案,它似乎正在工作並且使用的系統資源比 find -exec 解決方案少。這是我的最終命令行:

find /{boot,etc,home,lib,lost+found,opt,root,sbin,usr,var} -type f -print0 | xargs -r0 grep -nr 'needle' | mail myaddress@example.com -s 'References on xxx'

我使用該/{dir1,dir2,...,dirn}語法是因為我想要包含前導斜杠的完整路徑的輸出行,這樣您就可以在沒有cd /ie 的情況下從任何目錄使用該命令。

文件系統中有一些文件不是真正的文件,而是掛鉤到核心中。其中一些可以永遠閱讀。嘗試

grep foo /dev/zero

看到這個在行動。準備好在它接管整個系統之前用 ctrl-C 停止它。

如果我想做你正在做的事情,我會列舉/我想要掃描的子目錄,並確保我只檢查文本文件,可能與

cd /
find boot etc home lib lost+found media mnt opt root sbin tmp usr var -type f -exec grep needle {} /dev/null \;

請注意該列表如何包含/dev/proc或。/sys``/selinux

引用自:https://serverfault.com/questions/234382