我正在嘗試在我正在處理的服務器中查找哪個檔案包含特定字串。我試過了,grep -rnw但服務器很大,可能需要幾天才能完成。我不知道檔案可以放在哪里,也不知道它是如何命名的。我唯一知道的是它幾乎每天都在修改(不知道確切的時間或頻率,如果有的話)。
一種方法是列出過去 2 天內已修改的系統的每個檔案,并將 grep 搜索應用于這些檔案,但我不知道如何實作這一點。
uj5u.com熱心網友回復:
您確實可以find用來過濾最近修改的檔案,并且只對這些檔案進行 grep:
find / -type f -mtime -2 -exec grep -H -n "your search query" '{}' \;
-type f只匹配常規檔案-mtime -2匹配最近 2 天內修改的檔案(可能會增加這個以防萬一)-exec對所有匹配項執行以下命令find-H告訴 grep 在匹配行旁邊列印檔案名-n列印匹配的行號
uj5u.com熱心網友回復:
find ./ -mtime -2 -exec grep "ABC" {} /dev/null \; -ls
一些解釋:
-mtime -2:獲取最近兩天修改過的檔案(您可以根據需要修改值grep "ABC": 你要找的字串-exec do_something {} \;:這是使用搜索結果執行“do_something”的方式(稱為{})-ls:將其添加到您的find命令中會提供有關您找到的檔案的完整資訊。可以隨意省略
uj5u.com熱心網友回復:
到目前為止,您的其他答案都建議使用find'-exec功能為識別的每個候選檔案運行grep命令。這是可行的,但啟動成百上千個單獨的grep命令會很昂貴。find結合使用以將單獨命令xargs的數量減少到最少會更有效:grep
find / -type f -mtime -2 -print0 |
xargs -r0 grep -Fnw 'search string'
xargs將從其標準輸入讀取的檔案名分組以形成grep以給定單詞開頭的命令的引數串列,從而大大減少了單獨grep命令的數量。
另請注意:
- 示例命令使用 GNU
find和 GNU提供的擴展xargs。從示例命令中洗掉兩個0s 可以解決這個問題,但會讓您面臨涉及包含換行符的檔案名的問題。 - 如圖所示,對于您描述的情況,該
-F選項將grep稍微提高效率,其中搜索詞是固定字串。如果搜索詞包含任何正則運算式元字符,它還將保護您免受誤解的可能性。 findgrep如果您可以收集任何此類詳細資訊,則可以使用各種附加資訊來更有選擇性地選擇將哪些檔案傳遞給。例如,如果您可以確定哪個用戶將擁有該檔案,或者關于其模式(權限)的任何資訊,或者檔案大小的下限或上限。此外,如果您可以將搜索限制在小于整個檔案系統的范圍內,那么這當然也會改善經過的時間。- 對于一個大型檔案系統,無論你做什么,僅僅遍歷所有檔案,甚至不讀取它們的任何內容,都需要相當長的時間。
uj5u.com熱心網友回復:
嘗試使用:
find / -mtime 0 -exec grep "some string" "{}" \\;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/466762.html
