在整個文件系統上查找包含字元串的文件
我需要在整個文件系統中找到給定字元串的所有實例,因為我不記得我把它放在哪個配置文件、腳本或任何其他程序中,我需要用新的字元串更新該字元串。
我嘗試使用以下命令
`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