FIND(1)

名称
find - ディレクトリツリーを再帰的に下ってファイルを捜す

書式
find [-H | -L | -P] [-Xdx] [-f file] [file ...] expression

解説
find は、 file に対してディレクトリツリーを再帰的に下って、 ツリー上の各ファイルについて expression (後に示す ``プライマリ'' と ``演算子'' から構成されます) で指定された処理を実行します。

オプションとしては以下のものがあります:

-H  file で指定したファイルがシンボリックリンクファイルだった場合、シンボリックリンク 自体ではなく、リンク先のファイルに関してファイル情報とファイルタイプ( stat(2) 参照) を使って expression の処理をするように指定します。 もしリンク先のファイルがなければ、 シンボリックリンク自体を処理の対象とします。 コマンドラインからの file で直接指定されたのではなく、 ディレクトリツリー上で見つかったシンボリックリンクファイルに関しては、 シンボリックリンク自体を処理の対象とします。

-L  file で指定したファイルがシンボリックリンクファイルだった場合、シンボリックリンク 自体ではなく、リンク先のファイルに関してファイル情報とファイルタイプ( stat(2) 参照) を使って expression の処理をするように指定します。もしリンク先のファイルがな ければ、シンボリックリンク自体を処理の対象とします。

-P  シンボリックリンク自体に関して ファイル情報とファイルタイプ( stat(2) 参照) を使って expression の処理をするように指定します。 これがデフォルトです。

-X  xargs(1) と組み合わせて使うときのため、より安全に動作するようにします。もし xargs によりデリミタ文字 (single quote (`` ' ''), double quotes (`` " ''), backslash (``\''), space, tab, newline) が含まれるファイル名 が使われた場合、診断メッセージを標準エラー出力に表示して、 そのファイル名をスキップします。

-d  ファイルに対する処理順序を深さ優先の探索方式にします。 すなわち、ディレクトリ自体に 対する処理を行う前に、ディレクトリ内の個々のファイルに対して処理を 実行します。デフォルトでは、ディレクトリは最初に処理されます。 (デフォルトの方式は幅優先探索方式ではないです。)

-f file
    明示的にファイルを指定します。ファイル名の先頭が ``-'' で始まっていたり、 あとで述べる expression の指定と混同してしまうようなファイル名を指定したりするときに使用します。 (ファイルはオプション直後のオペランドとしても指定可能です。)

-x  ディレクトリツリーを下って行くとき、最初に file のあったファイルシステムとは 異なるファイルシステム上のファイルに対する処理になる場合は、実行しないように します。

プライマリ

-amin n
    最後にファイルがアクセスされた時刻と、 find を起動した時刻との差(1 分単位で切り上げます)が n 分であれば、真とします。

-atime n
    最後にファイルがアクセスされた時刻と、 find を起動した時刻との差(24 時間単位で切り上げます)が n 日であれば、真とします。

-ctime n
    最後にファイルのステータスが変更された時刻と、 find を起動した時刻の差 (24 時間単位で切り上げます) が n 日であれば、真とします。

-delete
    見付けたファイルやディレクトリを消去します。常に真を返します。 現在の作業ディレクトリから find は再帰的にディレクトリツリーを下ります。 セキュリティ上の理由から、 "." からの相対パス名に ``/'' 文字を含むファイル名のファイルを 消去しようとはしません。 このオプションにより暗示的に深さ優先の処理が指定されます。

-exec utility [argument ...];
    utility で指定した名前のプログラムを実行し、終了コードが 0 の場合、真とします。argument は、utility への引き数として渡されます。この 指定は、最後に必ずセミコロン (``;'') をつけてください。 utility もしくは argument の指定 のなかで ``{}'' が使われていた場合は、その部分が、現在 find が対象としてい るファイルのパス名に置き換えられます。ただし、 utility が実行されるときのカレントディレクトリは、 find が起動されたディレクトリのままです。

-execdir utility [argument ...];
    -execdir プライマリは -exec プライマリと同様ですが、 utility が現在のファイルを持つディレクトリにおいて実行される点が異なります。 文字列 ``{}'' に対して置換されるファイル名は適切ではありません。

-fstype type
    対象ファイルが格納されているファイルシステムのタイプが、 type で指定されたものである場合に真となります。 sysctl(8) コマンドを使用して、 システム上で利用可能なファイルシステムタイプを調べることができます:

        sysctl vfs

    さらに、2 つの 擬似タイプ ``local'' と ``rdonly'' があります。 ``local'' は、 find を実行しているシステム上に物理的 にマウントされているファイルシステムです。``rdonly'' は、リードオンリーで マウントされているファイルシステムです。

-group gname
    ファイルが gname で指定したグループに属している場合、真になります。 gname が数字で、そのようなグループ名がない場合は、 gname をグループ ID として扱います。

-inum n
    ファイルの i ノード番号が n なら、真になります。

-links n
    ファイルのリンク数が n なら、真になります。

-ls このプライマリは常に真になります。対象となっているファイルの情報を 標準出力に出力します。出力する内容は i ノード番号、 512 バイトブロックでのファイルの大きさ、 ファイルのパーミッション、ハードリンクの数、所有者、グループ、 バイトで表したファイルの大きさ、最後にファイルが修正された時刻、パス名です。 ファイルがブロック型もしくはキャラクタ型のスペシャルファイルならば、 バイトで表したファイルの大きさの代わりにメジャー番号とマイナー番号を 出力します。ファイルがシンボリックリンクならば、 ``->''の後にリンク先のファイルのパス名を表示します。 フォーマットは ``ls -dgils'' の出力結果と同じです。

-mtime n
    最後にファイルが修正された時刻と、 find を起動した時刻との差(24 時間単位で切り上げます)が n 日であれば、真とします。

-ok utility [argument ...];
    exec とほぼ同じですが、 utility を実行するかどうかの確認をユーザに求め、端末にメッセージを出力します。 ``y'' 以外の返答をした場合は、 コマンドは実行されず、 このプライマリの値は偽になります。

-name pattern
    対象ファイルのパス名の最後のファイル名部分が pattern で指定したものとマッチするかどうかを調べ、マッチした場合は真になります。 pattern としては、シェルで使われるパターンマッチ 指定 (``['', ``]'', ``*'', ``?'') を使用することができます。これらの文字は バックスラッシュ(``\'')を前において、パターンマッチ指定ではなく文字として 扱う事を明示することができます。

-newer file
    対象ファイルの修正日付が、 file で指定したファイルのものより新しい場合は、真になります。

-nouser
    対象ファイルの所有者が unknown の場合、真になります。

-nogroup
    対象ファイルのグループが unknown の場合、真になります。

-path pattern
    対象ファイルのパス名が、 pattern で指定したものとマッチす るかどうかを調べます、マッチした場合は真になります。 pattern としては、シェルで使われるパターンマッチ 指定 (``['', ``]'', ``*'', ``?'') を使用することができます。これらの文字は バックスラッシュ (``\'') を前において、パターンマッチ指定ではなく文字として 扱う事を明示することができます。 ``/'' は、そのままパスのディレクトリの区切りにマッチします。

-perm [mode]
    ファイルのモードを、 mode と比較します。 mode は、シンボル 形式( chmod(1) 参照) もしくは 8 進数形式で指定します。シンボル形式の場合は、 00000 から開始してパーミッションのセットとクリアを行います。 (プロセスのファイル生成マスクとは無関係です。) 8 進数形式の場合は、 ファイルのモードビットのうち、07777 (S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) の部分が比較対象になります。 mode の最初に ``-'' を指定した場合は、 mode でセットされているすべてのビットが ファイルのモードでもセットされていれば真となります。 ``-'' が指定されていない場合は、ファイルのモードと mode が完全に一致した場合にのみ真となります。 なお、 シンボル形式でモード指定をする場合は、少なくとも最初が ``-'' にならない ようにする必要があります。

-print
    このプライマリは常に真になります。 対象となっているファイルのパス名を標準出力に出力して改行します。 -exec, -ls, -ok, -print0 のどのプライマリも指定されなかった場合は、 与えられた式 given expression は (given expression) -print で置き換えられます。

-print0
    -print とほぼ同じですが、標準出力に対象となっているファイルのパス名を出力 したあと、改行ではなく、 ASCII NUL 文字(文字コード 0)を出力します。

-prune
    このプライマリは常に真になります。 対象となっているファイル配下のディレクトリに下りないようにします。 -d オプションが指定されている場合は、 -prune の指定は無効になります。

-size n[c]
    ファイルサイズを 512 バイトのブロック単位で数えたとき (端数は切り上げ)、 n ブロックであれば真になります。 n のあとに ``c'' が指定されていた場合は、ファイルサイズが n バイトであれば真になります。

-type t
    ファイルタイプが t で指定されたタイプに一致すれば真になります。 タイプとして、次のような指定が可能です:

    b   ブロックスペシャル
    c   キャラクタスペシャル
    d   ディレクトリ
    f   普通のファイル
    l   シンボリックリンク
    p   FIFO
    s   ソケット

-user uname
    ファイルの所有者が、 uname で指定されたユーザと一致すれば真になります。もし uname が数字で、そのようなユーザ名がなければ、 ユーザ ID が指定されたものとして扱います。

なお、数字を引数にとるプライマリは、 数字の前に ``+'' および ``-'' をつけることができます。 それぞれ ``n より大'' および ``n より小'' の意味になり、 ``正確に n''という意味ではなくなります。

演算子

以下の演算子を使って、プライマリを組み合わせることができます。 演算子は優先度が下がる順番で示されています。

(expression)
    もし、括弧内の expression が真なら、真になります。

!expression
    単項否定演算子( NOT )です。 expression が偽なら、真となります。

expression1 -and expression2

expression1 expression2
    論理積( AND )演算子です。 expression1 と expression2 の両方とも真のとき、真になります。 もし expression1 が偽なら、 expression2 は実行されません。 -and を書かずに、単に 2 つの expression を並べて

    expression1 expression2

    と書いても同じです。

expression1 -or expression2
    論理和( OR )演算子です。 expression1 か expression2 のどちらか一方でも真であれば、真になります。もし expression1 が真なら、 expression2 は実行されません。

使用例

コマンドラインからのタイプ例です。 find の演算子がシェルの特殊文字と間違われないように、 エスケープ文字 ``\'' を使用しています。

find  /  \!  -name  *.c  -print
    探索をルートディレクトリから開始し、ファイル名の終わりが ``.c'' でないものを表示します。

find  /  -newer  ttt  -user  wnj  -print
    探索をルートディレクトリから開始し、 ファイルが ``ttt'' というファイルより新しく、 所有者が ``wnj'' であるようなものを表示します。

find  /  \!  \(  -newer  ttt  -user  wnj  \)  -print
    探索をルートディレクトリから開始し、 ``ttt'' というファイルより古いか、 所有者が ``wnj'' 以外のファイルを表示します。

find  /  \(  -newer  ttt  -or  -user wnj  \)  -print
    探索をルートディレクトリから開始し、 ファイルが ``ttt'' というファイルより新しいか、 所有者が ``wnj'' であるようなものを表示します。

関連項目
chmod(1), locate(1), whereis(1), which(1), stat(2), fts(3), getgrent(3), getpwent(3), strmode(3), symlink(7)

規格
find ユーティリティの文法は p1003.2 の仕様で決められた文法のスーパセットです。 全 1 文字オプションと -inum, -print0, -delete, -ls のプライマリは p1003.2 の拡張です。

昔は -d, -h, -x のオプションは それぞれ ``-depth'', ``-follow'', ``-xdev'' のプライマリを 用いて実装されていました。 これらのプライマリは常に真に評価されていました。 これらのプライマリは 探索が始まる前に効果を与える本当のグローバル変数であったので、 いくつかの合法的な expression が予期しない結果となりました。 一例として ``-print -o -depth''の expression があります。 -print が常に真に評価されるため 標準の評価の順番では -depth は決して評価されないはずですが、 そうではありませんでした。

演算子の ``-or'' は ``-o'' として実装されていました。 演算子の ``-and'' は ``-a'' として実装されていました。

昔の実装では exec と ok のプライマリでは、 utility 名やその引数中において、 空白以外の文字が前後に続く ``{}'' を置き換えませんでした。 このバージョンでは utility 名やその引数のどの場所に ``{}'' が現れても 置き換えます。

バグ
find によって使われる特殊文字は多くのシェルにとっても 特殊文字です。 特に ``*'', ``['', ``?'', ``('', ``)'', ``!'', ``\'', ``;'' は、 シェルからエスケープされなくてはならないでしょう。

オプションとファイル名との間および ファイル名と expression との間を区切るデリミタが存在しませんので、 ファイル名にオプションと間違えるようなもの (``-xdev'' のようなもの) や、 expression と間違えるようなもの (``!'' のようなもの) を指定することは難しいです。 このようなファイル名を指定する場合は -f オプションを使うか、 getopt(3) で使われるオプション指定の終了記号 ``--'' を使用します。

-delete プライマリは、ファイルシステムツリーの検索順序に影響する 他のオプションとは十分には連係しません。

歴史
find コマンドは AT&T UNIX から登場しました。