パイプの検索と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' \;)

最初の例にはどのような問題がありますか?

答え1

最初の場合、grepはファイル名のリストを返しfind、2番目の場合はファイル名のリストがgrepの引数であるため、grepはファイル内を検索します。

パイプは、名前付きファイルではなく標準入力です。これがgrepが異なる動作をする理由です。
からman grep

grepは、名前付き入力ファイル(またはファイル名が指定されていない場合、または単一のハイフンマイナス記号(-)がファイル名として指定されている場合は標準入力)から、指定されたPATTERNと一致する行を検索します。

答え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

関連情報