GNU/Linux >> Linux の 問題 >  >> Linux

`-o` を使用すると、Linux の `find` が期待される結果をスキップするのはなぜですか?

-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 {} \;

Linux
  1. 起動可能なLinuxUSBスティックを作成するときに同期が非常に重要なのはなぜですか?

  2. Linux –Setuidが機能しないのはなぜですか??

  3. Linux –ロケールEs_mxは機能するがEsは機能しないのはなぜですか?

  1. このシェル パイプラインが終了するのはなぜですか?

  2. Linux で select が使用される理由

  3. C プリプロセッサが linux という単語を定数 1 と解釈するのはなぜですか?

  1. Linux がコンピューターを熱くするのはなぜですか?

  2. Linux では、稼働時間はいつからカウントされますか?

  3. Linux ネットワーク トラフィックが eth0 のみを通過するのはなぜですか?