這是我試圖運行的命令。
grep -r "printf" *.c
我正在嘗試從.c
cwd 中存在的所有檔案中獲取所有 printf 行。截至目前,我目前的目錄是 Desktop,並且.c
Desktop 下的子目錄中至少有 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
(因此適用於任何命令,例如wc
、cp
or tar
,而不僅僅是grep
):
Set(打開)噓艾爾選擇離子globstar
與指令
shopt -s globstar
這將導致**
作為文件名組件表示此處和下面的所有內容。因此,如果您位於Desktop
,則**
表示Desktop
目錄 中的所有內容及其子目錄。然後你可以使用
grep "printf" **/*.c
搜尋.c
中及其下的所有文件Desktop
。您不需要指定-r
,因為 shell 會為您執行遞歸,而且您不需要指定--include
,因為路徑名稱擴充模式(也稱為 glob 或通配符)包含*.c
。
你可以你nset 選項與shopt -u
.