findが時々コマンドラインパス引数と一致するのはなぜですか?

findが時々コマンドラインパス引数と一致するのはなぜですか?

Linuxでは、

cd /tmp
mkdir foo; cd foo

今実行

find . -name 'foo'

出力がありません。走っている間

find /tmp/foo -name 'foo'

与えられた出力は/tmp/foo私には理解できません。誰かが理由を説明できますか?

ベストアンサー1

find指定されたディレクトリツリーに移動し、見つかったファイルごとに指定された式を評価します。巡回は指定されたパスから始まります。仕組みをまとめると、次のようになりますfind . -name foo

  • コマンドラインの最初のパス:.
    • basename(.)がパターンと一致していますかfoo?いいえ、だから何もしないでください。
      これは/tmp/foo同じディレクトリの別の名前です。しかし、findそれを知りません(知ろうと努力してはいけません)。
    • パスはディレクトリですか?はい、繰り返し見てください。リスト内の項目を列挙.し、各項目に対して反復処理を実行します。
      • ディレクトリは空です。および.その他の項目は含まれておらず、再帰的には検索されません。そして作業が完了しました。..find

そしてfind /tmp/foo

  • コマンドラインの最初のパス:/tmp/foo
    • basename(foo)がパターンと一致していますかfoo?はい、条件が満たされました。
      • この条件に関連するジョブがないため、パスを印刷する基本ジョブが実行されます。
    • パスはディレクトリですか?はい、繰り返し見てください。リスト内の項目を列挙/tmp/fooし、各項目に対して反復処理を実行します。
      • ディレクトリは空です。および.その他の項目は含まれておらず、再帰的には検索されません。そして作業が完了しました。..find

.とは/tmp/foo同じディレクトリですが、find同じ動作を保証するのに十分ではありません。このfindコマンドには、同じファイルへのパスを区別する方法があり、-nameその1つが述部です。find /tmp/foo -name foo開始ディレクトリとその下に指定されたすべてのエントリと一致しますfoofind . -name .開始ディレクトリのみが一致します(.再帰巡回中には見つかりません)。

おすすめ記事