テストフラグがないのに、なぜ「find」は検索中のディレクトリだけを印刷するのですか?

テストフラグがないのに、なぜ「find」は検索中のディレクトリだけを印刷するのですか?

bashに似たコマンドを実行すると、sudo find . "*dev/null"シェルは式に一致するディレクトリに一致するエントリを検索するすべてのディレクトリを印刷します。

ただし、テスト条件(たとえば)を追加するフラグを発行すると、sudo find . -wholename "*dev/null"シェルは検索した式に一致するディレクトリ(およびアクセスできないディレクトリ)のみを印刷します。

マニュアルページを見ましたが、findコマンドにテストを追加すると、なぜ発生するのかを説明するものが見つかりませんでした。いいえ検索された各ディレクトリを印刷します。このfindコマンドがテストインスタンスで印刷されない理由を説明できる人はいますか?

答え1

そしてsudo find . "*dev/null"両方から.*dev/null出発点。すべてが一致するという明示的なテストはありません。走るときとほぼ同じです。

sudo find .
sudo find "*dev/null"

後者が印刷する可能性が最も高いですが、find: '*dev/null': No such file or directory前者は以下を探します。すべて存在する.

sudo find . -wholename "*dev/null"スニペットには-wholename "*dev/null"実際のテストがあります。


~からPOSIX仕様、次のスニペットが関連しています。

ユーティリティfindは、pathで指定された各ファイルからディレクトリ階層を繰り返しダウンさせ、各ファイルのOPERANDSセクションで説明されている基本色で構成されるブール式を評価する必要があります。

式がない場合は、-print式として使用する必要があります。

-print
デフォルトは常にtrueと評価する必要があり、現在のパス名が標準出力に書き込まれます。

あなたのsudo find . "*dev/null"事実ですsudo find . "*dev/null" -print。どのテストも以前に式の評価を停止-printできないため、到達したfindテストのすべてのパス名に対してすべてのパス名が印刷されます。-print

その他のクリップ:

( expression )
本当なら本当ですexpression

expression [-a] expression
基本演算子の組合せ、AND演算子は、2つの基本演算子の並置によって暗示されるか、オプションの演算子-aによって指定されます。最初の式がfalseの場合、2番目の式を評価しないでください。

式がない場合は、-print式として使用する必要があります。それ以外の場合、与えられた式にデフォルトの色または-execが含まれていない場合、与えられた式は次に効果的に置き換えられます。-ok-print

( given_expression ) -print

-exec注: 実装は、、-okコレクションに追加できます-print

あなたのsudo find . -wholename "*dev/null"同等

sudo find . \( -wholename "*dev/null" \) -a -print

(角かっこはシェルに特別なのでエスケープされます。)

これで-wholename "*dev/null"falseと評価された場合、それはうまくいくので-print評価されません。-aこれにより、指定されたパス名のテストが失敗した場合、パスfind名は印刷されません。


メモ:

  • POSIX 以外の拡張は、ツールの全体的なアイデアを変更しないでください。
  • -wholenamePOSIXでは必要ありません。それでもGNUでは、POSIXで指定したfindものと同じです。-path
  • あなたは見つけることができます私の他の答え興味深い。

関連情報