同様の検索を実行するときに find コマンドの後に - パラメーターを追加すると、find -type d
そのパラメーターがない場合よりも多くの結果が検索されます。print0
find -print0 -type d
答え1
シェル(そしてC、C ++、および派生言語)で&&
and演算子を知っている場合はそれを知っています。||
-a
-o
find
記憶を復活させる:
シェルでは、
コマンド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
以前に評価された論理値(評価時に-true
OR-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
-false
FALSE
FALSE
-false
-false -a -printf 'nope\n'
:最初のオペランドは式なので何も実行されず、その値があるため評価がFALSE
短絡されるため、式全体が値を持ち、減少します。次の式/演算を使用して評価される式の式に適用されます。<expr1>
FALSE
<expr2>
FALSE
-false
-false -o -printf 'yep\n'
:最初のオペランドは式なので、何もしませんが、その値があるため、評価はFALSE
短絡されません。<expr1>
FALSE
printf '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 d
TRUE
FALSE
TRUE
FALSE
-type d