Grep

為什麼管道查找和 grep 什麼都不返回?

  • January 9, 2016

我試圖在grep返回的指定文件中進行搜尋find

find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'

這行不通。

同時,這行得通。

grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)

我的第一個例子有什麼問題?

在第一種情況下,您 grep 返回的find文件名列表,而在第二種情況下,文件名列表是 grep 的參數,因此 grep 將在文件中搜尋。

管道是標準輸入,而不是命名文件。這就是 grep 行為不同的原因。

來自man grep

grep 搜尋命名的輸入文件(或標準輸入,如果沒有文件被命名,或者單個連字元-減號 (-) 作為文件名給出)中包含與給定 PATTERN 匹配的行。

因為在第一種情況下grep嘗試在文件名中查找“MyClass”,而在第二種情況下,它嘗試在文件內容中查找“MyClass”。

第一個等於

find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;

而第二個等於

find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;

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