使用 grep 在目錄中遞歸搜尋,忽略單個文件
有沒有辦法讓 grep 搜尋整個目錄,但忽略一個文件中的匹配項?
我正在使用的命令是:
grep -rn 'SearchTextHere'
我需要忽略的文件有一個奇怪的文件名:
=
.是的,文件名只是一個等號。是的,我也不明白。
(不確定它是否應該存在,所以我不能刪除它。我不認為這是一個意外的 grep 管道傳輸到文件或類似的東西。)
grep 版本 3.4
看起來steeldriver的評論建議有效:
grep -rn 'SearchTextHere' --exclude==
或者我猜對於一個普通的文件名它會是
grep -rn 'SearchTextHere' --exclude=FileToIgnore
我試圖使用手冊頁中的“–exclude-from”。不知道那是為了什麼。
=
-named 文件可以出現在以下情況下:[ a >= b ]
或者:
expr a >= b
錯誤地,因為這基本上與以下內容相同:
[ a b ] > '=' expr a b > '='
那就是執行這些
[
或expr
命令,並將其輸出重定向到=
. 作為>
shell 語法中的重定向運算符,>
應引用:expr a '>=' b
[ a '>=' b ]
(儘管很少有
[
實現支持>=
運算符;yash
的內置支持[
)如果
=
你的那個文件是空的,那是一種可能的解釋。現在要排除
=
在 GNU 遞歸搜尋中呼叫的任何文件grep
,您可以使用:grep -rn --exclude== SearchTextHere .
或者:
grep -rn --exclude = SearchTextHere .
--exclude-from
當您想在文件中提供排除列表時。在這裡,雖然你可以這樣做:echo = | grep --exclude-from=/dev/stdin -rn SearchTextHere .
這與使用
--exclude
.無論如何,沒有辦法告訴 GNU
grep -r
只排除=
目前目錄中的那個(並且仍然=
在其他子目錄中找到的文件中搜尋)。為此,您可以使用find
來查找文件並排除=
並讓它呼叫grep
以搜尋文件中的文本,因為無論如何您都會按照標准進行操作,因為-r
這不是標準grep
選項。find . ! -path './=' -type f -exec grep -n SearchTextHere /dev/null {} +
(添加
/dev/null
到保證grep
將始終列印文件的名稱,即使find
只找到一個文件;使用 GNUgrep
,您也可以使用該-H
選項)。或者跳過呼叫的目錄
=
和其中的任何文件(grep --exclude =
不這樣做):find . -name = -prune -o -type f -exec grep -rn /dev/null {} +
(此處跳過任何名為
=
.的文件/目錄。-path ./=
用於僅跳過=
目前目錄中的目錄)。