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が、2 番目のケースではファイル名のリストが grep の引数であるため、 grep はファイル内を検索します。

パイプは標準入力であり、名前付きファイルではありません。そのため、grep の動作が異なります。
出典man grep:

grep は、指定された入力ファイル (ファイル名が指定されていない場合、またはファイル名として単一のハイフンマイナス (-) が指定されている場合は標準入力) で、指定されたパターンに一致する行を検索します。

答え2

最初のケースではgrepファイル名で「MyClass」を見つけようとし、2 番目のケースではファイルの内容で「MyClass」を見つけようとします。

最初のものは

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

2番目は

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

関連情報