「find -o」で式と演算を使用する

「find -o」で式と演算を使用する

findマニュアルページによると、ORは式と共に使用されます。

expr1 -o expr2
              Or; expr2 is not evaluated if expr1 is true.

-printそれでは、この例のような作業でも機能するのはなぜですか?

find . -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; -or -print

(からディレクトリの後にスラッシュを表示させますか?)。

ベストアンサー1

行動は表現また副作用のある表現でもあります。 (POSIXアクションは言及さえありません。 )

-exec場合、式の値は実行されたコマンドの状態を反映します。成功した場合(終了コード0で示されている)、式の値はtrue、そうでない場合はfalseです。だから

find . -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; -or -print

現在のディレクトリで繰り返されます。ディレクトリの下にあるファイルの場合は実行されますshprintfディレクトリの後にスラッシュがあります)。他のすべての場合は、ジョブが実行されfindますprint-orここで重要な値はsではなくsです。-type d -exec ...-print-type d-exec

詳しくは、find優先順位の規則は次のとおりです。

find . -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; -or -print

次のように明示的に作成できます。

find . \( -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; \) -or -print

接続式-orは次のとおりです。

-type d -exec sh -c 'printf "%s/\n" "$0"' {} \;

そして

-print

完全な表現セット(用語の一般的な意味では、つまりディレクトリなどを含む)、左から始まる:

  1. -type d現在のファイルがディレクトリの場合はtrueと評価され、それ以外の場合はfalseと評価されます。

  2. -exec ...前の式がtrueの場合、現在のファイルがディレクトリかどうかを評価します。評価には現在のファイルを引数として実行するアクションが含まれ、sh -c 'printf "%s/\n" "$0"'結果はステータス0で終了した場合はtrue、そうでない場合はfalseです。sh

  3. -print-type前の式(および)の結果が次のように-exec評価されます。間違ったつまり現在のファイルがディレクトリではないか、ディレクトリですがsh失敗しました。

おすすめ記事