Grep

跨越多個目錄

  • April 28, 2020

我想執行這個:

grep -r zlib *.cpp

但這會失敗,除非目前目錄中有 .cpp 文件(在這種情況下只搜尋它):

grep: *.cpp: No such file or directory

現在:

grep -r zlib *

是否搜尋整個層次結構,但我想將搜尋限制為(例如).cpp 文件。

瀏覽了人和許多食譜網站,但找不到我認為是一個簡單查詢的答案 - 所以提前道歉。

它與 無關grep,但與您目前的 shell 無關。在執行命令之前,shell 會擴展*.cpp為目前目錄中的所有 cpp 文件名。grep由於找不到任何文件名,*.cpp因此 shell 不會擴展 glob。該grep命令試圖查看這是一個文件,但嬰兒床認為它不是一個真正的文件。

你有幾個選擇,使用find

find . -type f -name "*.cpp" -exec grep -r zlib {} +

或者,如果您使用的是bashshell,請設置 nullglob 選項以停止將未擴展的 glob 作為有效結果返回。這(..)是為了使擴展的 shell 選項是臨時的,而不是使其在 shell 中持久化。擁有該--include=*.cpp選項的原因是,如果設置了選項,glob 擴展失敗*.cpp將變為空並且您的命令變為grep -r zlib這意味著在下面的整個子目錄中搜尋。

( shopt -s nullglob; grep -r --include=*.cpp zlib . ; )

另一個不包括--include選項grep但使用globstar允許在子目錄中進行遞歸全域擴展的變體

( shopt -s nullglob globstar; grep -rH zlib **/*.cpp  ; )

記住--include=and-H是 GNU grep 選項,不兼容 POSIX

引用自:https://unix.stackexchange.com/questions/583066