為什麼管道 find 和 grep 不回傳任何內容?

為什麼管道 find 和 grep 不回傳任何內容?

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

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

這是行不通的。

同時,這有效。

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

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

答案1

在第一種情況下,您 grep 傳回的檔案名稱列表find,而在第二種情況下,檔案名稱列表是 grep 的參數,因此 grep 將在檔案內部搜尋。

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

grep 搜尋命名輸入檔案(如果沒有命名文件,或者如果給出單一連字減號 (-) 作為檔案名,則搜尋標準輸入)以尋找包含與給定 PATTERN 相符的行。

答案2

因為在第一種情況下,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' {} \;" \;

答案3

我認為你的find命令應該是:

find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'

它查找mydir具有.java擴展名並包含的文件我的課-H指示grep在結果前面輸出檔案名稱。

相關內容