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