為什麼對所有子目錄中的字串執行 grep 不起作用?

為什麼對所有子目錄中的字串執行 grep 不起作用?

這是我試圖運行的命令。

grep -r "printf" *.c

我正在嘗試從.ccwd 中存在的所有檔案中獲取所有 printf 行。截至目前,我目前的目錄是 Desktop,並且.cDesktop 下的子目錄中至少有 10-15 個文件,但此命令根本不顯示任何匹配項。那麼在這種情況下我該如何使其工作?

答案1

如果你這樣做:

grep -r "printf" *.c

shell 將擴展*.c到以當前目錄結尾的所有檔案/目錄.c,如果不存在這樣的檔案/目錄,則模式將按字面意思處理(假設您沒有nullglob設定)。

正如您所看到的,您當前的模式永遠不會位於當前目錄下,因為當前目錄中沒有任何.c文件,或者如果有的話,它們也沒有printf,從而導致空輸出。

您需要使用--include僅在選擇性文件中搜索,並且還-r可以遞歸遍歷:

grep -r --include="*.c" "printf" .

上面的程式碼將從目前目錄開始遞歸地在所有.c檔案中搜尋字串 (pattern) 。printf

如果您想追蹤所有符號連結:

grep -R --include="*.c" "printf" .

答案2

如果您想知道為什麼您的命令不起作用,請參閱另一個答案。如果您想知道如何使其工作,這裡有另一種方法(複製自 Grep 尋找目錄下具有特定副檔名的文件 具有修飾本地化), 使用 的功能bash 而不是 的功能grep (因此適用於任何命令,例如wccpor tar,而不僅僅是grep):

Set(打開)艾爾選擇離子globstar與指令

shopt -s globstar

這將導致**作為文件名組件表示此處和下面的所有內容。因此,如果您位於Desktop,則**表示Desktop目錄 中的所有內容及其子目錄。然後你可以使用

grep "printf" **/*.c

搜尋.c中及其下的所有文件Desktop。您不需要指定-r,因為 shell 會為您執行遞歸,而且您不需要指定--include,因為路徑名稱擴充模式(也稱為 glob 或通配符)包含*.c


你可以nset 選項與shopt -u.

相關內容