我試圖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
在結果前面輸出檔案名稱。