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
現在のディレクトリで繰り返されます。ディレクトリの下にあるファイルの場合は実行されますsh
(printf
ディレクトリの後にスラッシュがあります)。他のすべての場合は、ジョブが実行され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
完全な表現セット(用語の一般的な意味では、つまりディレクトリなどを含む)、左から始まる:
-type d
現在のファイルがディレクトリの場合はtrueと評価され、それ以外の場合はfalseと評価されます。-exec ...
前の式がtrueの場合、現在のファイルがディレクトリかどうかを評価します。評価には現在のファイルを引数として実行するアクションが含まれ、sh -c 'printf "%s/\n" "$0"'
結果はステータス0で終了した場合はtrue、そうでない場合はfalseです。sh
-print
-type
前の式(および)の結果が次のように-exec
評価されます。間違った、つまり現在のファイルがディレクトリではないか、ディレクトリですがsh
失敗しました。