Grep
為什麼管道查找和 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' \;)
我的第一個例子有什麼問題?
在第一種情況下,您 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' {} \;" \;