Grep

使用 grep 在目錄中遞歸搜尋,忽略單個文件

  • August 22, 2021

有沒有辦法讓 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.

無論如何,沒有辦法告訴 GNUgrep -r只排除=目前目錄中的那個(並且仍然=在其他子目錄中找到的文件中搜尋)。為此,您可以使用find來查找文件並排除=並讓它呼叫grep以搜尋文件中的文本,因為無論如何您都會按照標准進行操作,因為-r這不是標準grep選項。

find . ! -path './=' -type f -exec grep -n SearchTextHere /dev/null {} +

(添加/dev/null到保證grep將始終列印文件的名稱,即使find只找到一個文件;使用 GNU grep,您也可以使用該-H選項)。

或者跳過呼叫的目錄=和其中的任何文件(grep --exclude =不這樣做):

find . -name = -prune -o -type f -exec grep -rn /dev/null {} +

(此處跳過任何名為=.的文件/目錄。-path ./=用於僅跳過=目前目錄中的目錄)。

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