-or
を使用したことがあると思います 論理 OR を使用して接続された複数の条件がある場合、論理演算のあいまいな順序を避けるために、一貫性を保つ必要があります。
-exec
のようです 部分は 2 番目の -name "*.h"
と一緒にグループ化されます .
したがって、正しく機能させるには、以下のように括弧を追加する必要があります:
find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'
<ブロック引用>
または、-regex
を使用して、いくつかの拡張機能を 1 つに結合します。 :
find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;
ない。 「間違っている」のはオプションの構文です。 find
順次評価します。したがって、最初の式 (-name "*.cpp"
) 次に -o
に遭遇します 国旗。最初の式が真の場合、find
2 つ目の評価は続行しません (-name "*.h" -exec echo {} \;
)、代わりに何もしません。ほら、-o
以降の部分全体 1つの表現です。したがって、これは 2 番目の式に一致するファイルに対してのみ実行されます。 1.h
しか表示されないのはそのためです。 このファイルは、2 番目の式のみを渡します。検索のマンページを参照してください:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
これが役立つ理由 以下を検討してください:
find /path -exec test_file_for_something {} -print \; -o -name "xyz" -exec ls -l {} \;
この検索ステートメントでは、ファイルは test_file_for_something
に渡されます パラメータとして。ここで、そのコマンドの戻りコードに応じて、最初の式は true (その後 -print
が実行されそこで終了する) または false (-o
の後の 2 番目の式) フラグが評価されます)。そして、それが本当なら (名前は xyz
です) )、その後 -exec
実行されます。
あなたの問題では、代わりにこれを使用して、要素を1つの式としてグループ化できます :
find . \( -name "*.cpp" -o -name "*.h" \) -exec echo {} \;