find コマンドで -or および -exec を使用すると発生する問題

find コマンドで -or および -exec を使用すると発生する問題

-execでfindの-or演算子を使用したときに期待した結果が得られなかったことがわかりました。 .cppファイルと.hファイルを検索するときに-execを使用しないと、コマンドは期待どおりに機能します。

find . -name '*.cpp' -or -name '*.h'
./file1.cpp
./file1.h
./file2.cpp
./file2.h

ただし、-execを使用すると、.hファイルのみが渡されるようです。

find . -name '*.cpp' -or -name '*.h' -exec echo '{}' \;
./file1.h
./file2.h

より一般的な方法を使用して結果を返すと正常に動作します。

echo $(find . -name '*.cpp' -or -name '*.h')
./file1.cpp ./file1.h ./file2.cpp ./file2.h

しかし、-execが通常より便利なので、何が間違っているのか疑問に思います。私はMac OSX 10.9を使用していますが、Cygwin端末でも同じ問題が発生します。ここで何の問題がありますか? -execを目的の方法で動作させるにはどうすればよいですか?

ベストアンサー1

これは、-exe ジョブが -name "*.h" に関連付けられているためです。式の周りにかっこを入れるとうまくいきます。デフォルトのジョブは-printなので、初期式が機能します。

find . \( -name '*.cpp' -or -name '*.h' \) -exec echo '{}' \;

また、|を使用すると効率のために|

おすすめ記事