----------------長い話を短く----------------

----------------長い話を短く----------------

同様の検索を実行するときに find コマンドの後に - パラメーターを追加すると、find -type dそのパラメーターがない場合よりも多くの結果が検索されます。print0find -print0 -type d

答え1

シェル(そしてC、C ++、および派生言語)で&&and演算子を知っている場合はそれを知っています。||-a-ofind

記憶を復活させる:

シェルでは、

コマンド1  &&  コマンド2

走るcommand1そして、もしそうなら(command1)正常に(シェル)が実行されます。command2

コマンド1  ||  コマンド2

走るcommand1そして、もしそうなら(command1) 失敗すると(シェル)が実行されます.command2

コンパイル可能な言語では

式1  &&  式2

評価するexpr1。その場合(expr1)はfalse(ゼロ)と評価され、その値を式全体の値として返します。そうでなければ(expr1真(ゼロ以外)の値として評価されます)expr2これを全式の値として返します。

式1  ||  式2

評価するexpr1。その場合(expr1)は真(ゼロ以外)の値として評価され、これは式全体の値として返されます。そうでなければ(expr1偽(0)と評価)expr2これを全式の値として返します。

    式の合計値を決定するために必要な値を持つ項を必要とせずにブール式を評価できるため、これを「段落評価」と呼びます。

から引用検索(1)

GNUは、find優先順位規則(演算子のセクションを参照)に従って左から右に与えられた式を評価し、結果がわかるまで(左はfalse)、各与えられたファイル名にルートを持つディレクトリツリーを検索します。そしてジョブに適用可能または)、find次のファイル名に移動します。
            ⋮

表現方式

式はテスト(真または偽の値を返す)と演算(副作用があり、真または偽の値を返す)で構成され、両方とも演算子で区切られます。  -そして演算子が省略されたとします。
                    ⋮
    このセクションは次のとおりです。行動指摘-印刷ほとんどの操作と同様に、
    常に真の値が返されます。
                    ⋮

オペレーター

            ⋮
式1 式2
式1-ㅏ式2
式1-そして式2    ··············································· ········································POSIX規格に準拠していない
    そして;式2次の場合は評価されません。式1偽です。
式1- モールド式2
式1- または式2    ··············································· ········································POSIX規格に準拠していない
    または;式2次の場合は評価されません。式1それは真実だ。

これ公開グループ仕様find同様の言葉は次のとおりです。

これ探すユーティリティは、ディレクトリ階層を繰り返しダウンして、見つかった各ファイルのオペランドセクションで説明されている基本要素で構成されるブール式を評価する必要があります。
            ⋮

オペランド

            ⋮
-印刷
    デフォルトは常にtrueと評価する必要があり、現在のパス名が標準出力に書き込まれます。
            ⋮
基本色は、次の演算子を使用して組み合わせることができます(優先順位が下がる順序で):
            ⋮

表現する [-ㅏ] 表現する
    基本項目の組み合わせ、AND 演算子は、2 つの基本項目の並置によって暗黙的またはオプションで明示的です。-ㅏオペレーター。最初の式がfalseの場合、2番目の式を評価しないでください。
表現する  - モールド  表現する
    基本シフトまたは演算子。最初の式がtrueの場合、2番目の式を評価しないでください。

どちらの文書も次のように言います。 「そうでなければ表現する存在する、-印刷表現の手段として使用する必要があります。 」

----------------長い話を短く----------------

だから、

find -type d

等しい

find -type d -print

これは次のとおりです。

find -type d -a -print

意味は、

  • 各ファイルについて
    • 評価-type dテスト。
    • trueの場合(つまり、現在の「ファイル」がディレクトリの場合)、ジョブは-print評価(実行)されます。

しかし、

find -print -type d

等しい

find -print -a -type d

意味は、

  • 各ファイルについて
    • -print作業評価(実行)(つまり、これが起こりますすべてのファイルについて)
    • true(常に-print)の場合、-type dテストは評価されます。
    • また、コマンドの終わりなので、テスト結果は-type d無視されます。

だからそこにあります。

答え2

パラメータを照会する順序が重要です。コマンドを次のようにビルドする必要があります期待find -type d -print0どおりに動作します。誰かが役に立つかどうかを投稿してみました。

答え3

コマンドを理解するためのヒントfindは、最初の2つの式/アクションを再帰的に評価し、それを結果の論理値の適切な式(または)-true-falseグループ化することです。この時点で、各式/アクションペアの評価は短絡されます(したがって、比較の2番目のオペランドの式/作業は最初の評価された式です)、比較された式AND/FALSE作業の場合はOR評価/評価および実行されません。 2番目のオペランドは評価/評価と実行されません。TRUEプロセス中に発生する各操作は、常にTRUE以前に評価された論理値(評価時に-trueOR-false式に縮小)に基づいています。式/作業ペア

便利な例の拡張協会1_CR公開済み:

find . -false -o -false -a -printf 'nope\n' -o -printf 'yep\n' -o -printf 'nope\n'
yep
  • -false -o -false:最初のオペランドは式なので、何もしません。その値は評価が短絡FALSEされないため、式全体が値を持ち、式式に折りたたまれます。次の式/演算を使用して評価されます。<expr1>FALSE-falseFALSEFALSE-false
  • -false -a -printf 'nope\n':最初のオペランドは式なので何も実行されず、その値があるため評価がFALSE短絡されるため、式全体が値を持ち、減少します。次の式/演算を使用して評価される式の式に適用されます。<expr1>FALSE<expr2>FALSE-false
  • -false -o -printf 'yep\n':最初のオペランドは式なので、何もしませんが、その値があるため、評価はFALSE短絡されません。<expr1>FALSEprintf 'yep\n'今評価して実行してください、その値はでTRUEあり、式全体の値はであり、次の式/演算を使用して評価される式TRUEに縮小されます。-true
  • -true -o -printf 'nope\n':最初のオペランドは式であるため何も実行されず、その値はそのため評価がTRUE短絡されるため、式全体の値はです。<expr1>TRUE<expr2>TRUE

同じ操作を実行すると、find [...] -print0 -type d次のように拡張されますfind [...] -print0 -a -type d(欠落している演算子がAND演算子に拡張されるため)。

  • -print0 -a -type d: 最初のオペランドはアクションなので-print0今評価して実行してください、その値はですTRUE。評価は短絡されません。したがって、<expr1>評価の値はまたはテスト結果に基づいています。TRUE-type dTRUEFALSETRUEFALSE-type d

関連情報