Grep
跨越多個目錄
我想執行這個:
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 {} +
或者,如果您使用的是
bash
shell,請設置 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