2.2 検索の開始点

GNU findは、指定された各開始点を根とするディレクトリツリーを検索します。演算子の優先順位に従い、指定した式を左から右へ評価し、結果が確定するまで続けます。「and」演算では左辺が偽、「or」演算では左辺が真になった時点で結果が確定し、findは次のファイル名へ進みます。

開始点を指定しない場合、現在のディレクトリ「.」が使われます。

理論上、2つのダッシュ「--」は、それ以降の引数がオプションではないことを示すために使えます。しかし、findが開始点引数の一覧の終わりを判断する方法のため、これは実際にはうまく機能しません。式の引数が現れるまで読み取り、その引数も「-」で始まります。開始点引数が「-」で始まると、findはそれを式の引数として扱います。したがって、すべての開始点を開始点として扱わせ、特に、呼び出し元のシェルが展開したワイルドカードを式の引数と誤認させないためには、ワイルドカードや紛らわしいパス名の前に「./」を付けるか、「/」で始まる絶対パス名を使うのが、一般に安全です。

別の方法として、移植性はありませんが、GNUのオプション「-files0-from」で任意の開始点をfindへ渡すのも一般に安全です。

オプション: -files0-from file

開始点をコマンド行から取得する代わりに、fileから読み取ります。コマンド行引数で開始点を渡す場合には、渡せるファイル名の数に制限があり、ファイル名とオプション名が衝突するという本質的な曖昧さもあります。このオプションを使うと、任意の数の開始点を安全にfindへ渡せます。

このオプションの使用と、コマンド行で開始点を渡すことは排他的であり、同時には行えません。

file引数は必須です。「-files0-from -」を使うと、たとえばパイプから、標準入力ストリームを通して開始点の一覧を読み取れます。この場合、「-ok」と「-okdir」アクションは使えません。ユーザーの確認を得るための標準入力の読み取りが、開始点の読み取りと明らかに干渉するからです。

file内の開始点は、ASCII NUL文字で区切る必要があります。NUL文字が2つ連続する、つまり長さゼロのファイル名を開始点とすることは許可されません。その場合、エラーの診断メッセージが出力され、その後にゼロ以外の終了コードで終了します。

指定したfileが空の場合、findは開始点を1つも処理せず、プログラムの引数を解析した直後に終了します。パス引数が渡されないと現在のディレクトリを開始点とみなす通常のfindの呼び出しとは異なります。

そのほかの開始点の処理は通常どおりです。たとえば、別途抑制しない限り、findはサブディレクトリへ再帰的に進みます。開始点だけを処理するには、さらに「-maxdepth 0」を指定します。

注意事項

このオプションを安全に使うためには、次の点に注意する必要があります。

  • 重複したエントリがないことを確認してください。
    • 重複があると、一部のファイルが複数回訪問される場合も、されない場合もあります。
  • findの実行中にファイルを変更しないでください。
    • 同時に行われた変更の影響は規定されていません。
  • ファイルの最終的なシーク位置に依存しないでください。
    • 最終的なシーク位置は保証されません。プラットフォーム、findutilsのリリース、さらにはfindの実行ごとに異なる場合があります。
    • そのため、「-files0-from」と別の用途で、開かれた同じファイルを共有しても、意図した結果を確実に得られる可能性は低くなります。別の用途には、findの別のインスタンスで「-files0-from」を使う場合も含みます。複数のプログラムで同じファイルを読み取る必要がある場合は、プログラムごとに別々に開いてください。

あるプログラムproggyが事前に絞り込み、大量のファイルをNUL区切りで列挙した一覧を作成したとします。その一覧を開始点として処理し、その中から通常の空ファイルすべてを検索できます。

$ proggy | find -files0-from - -maxdepth 0 -type f -empty

「-files0-from -」を使うと、標準入力、つまりパイプから開始点の名前を読み取ります。「-maxdepth 0」を使うと、明示的に指定したエントリだけを調べ、開始点のいずれかがディレクトリでも、その内部へ再帰的に進まないことを保証できます。