FIND(1)

名称
find - ディレクトリツリーを渡り歩く

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

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

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

-H  コマンドライン上で指定したファイルがシンボリックリンクファイルだった場合、 ファイル情報とファイルタイプ (stat(2) 参照) として、シンボリックリンク自体のものではなくリンク先のファイルのものを 使うようになります。もしリンク先のファイルがなければ、 リンク自体を処理の対象とします。コマンドライン上で指定したものではない シンボリックリンクは全て、そのリンク自体のファイル情報が利用されます。

-L  各シンボリックリンクのファイル情報とファイルタイプ (stat(2) 参照) として、シンボリックリンク自体のものではなくリンク先のファイルのものを 使うようになります。もしリンク先のファイルがなければ、 リンク自体を処理の対象とします。

-P  各シンボリックリンクのファイル情報とファイルタイプ (stat(2) 参照) として、シンボリックリンク自体のものを使うようになります。

-X  xargs(1) と組み合わせて使うときのため、より安全に動作するようにします。もし xargs で使われるファイル名にデリミタ文字が含まれる場合、診断メッセージを 標準エラー出力に表示して、そのファイルをスキップします。 デリミタ文字には、シングルクォート(`` ' '')、ダブルクォート(`` " '')、 バックスラッシュ (``\'')、空白、タブ、改行が含まれます。

-d  深さ優先の探索、すなわち、ディレクトリは post-order で探索し、 ディレクトリ内の全エントリはそのディレクトリ自身より先に処理されます。 デフォルトでは、 find はディレクトリを pre-order で探索、つまりその中身より先に評価します。 デフォルトは幅優先の探索では ない という点に注意してください。

-f file
    find が探索するディレクトリツリーを指定します。 複数のディレクトリツリーをオプションの直後に並べて指定することもできます。

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

-x  検索を開始したディレクトリが属すデバイスのデバイス番号とは違う番号のデバイスは 検索しないようにします。

プライマリ

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

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

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

-follow
    シンボリックリンクの先を辿ります。

-fstype type
    対象ファイルが格納されているファイルシステムの種類が、 type で指定されたものである場合に真となります。 sysctl(8) コマンドを使って

        sysctl vfs

    などとすれば、そのシステムで指定可能なファイルシステムの種類がわかります。 上記のものに加えて、``local'' と ``rdonly'' の 2 つの疑似 type を 指定することができます。 前者はそのシステム上に物理的にマウントされているファイルシステムにマッチし、 後者はリードオンリーでマウントされているファイルシステムにマッチします。

-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'' 以外の返答をした場合は、 そのコマンドは実行されず、その ok 式の値は偽になります。

-name pattern
    対象ファイルのパス名の最後のファイル名部分が pattern で指定したものとマッチすれば真になります。 pattern の部分には、シェルで使われるパターンマッチ文字 (``['', ``]'', ``*'', ``?'') を使用することができます。 これらの文字は、バックスラッシュ (``\'') でエスケープすることで その文字そのものにマッチさせることができます。

-newer file
    現在対象となっているファイルの最終更新時刻が file のものより新しい場合に、真になります。

-nouser
    対象ファイルのユーザが unknown になっている場合に真になります。

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

-path pattern
    対象ファイルのパス名が pattern で指定したものとマッチすれば真になります。 pattern の部分には、シェルで使われるパターンマッチ文字 (``['', ``]'', ``*'', ``?'') を使用することができます。 これらの文字は、バックスラッシュ (``\'') でエスケープすることで その文字そのものにマッチさせることができます。 スラッシュ (``/'') は、そのままパスのディレクトリの区切りにマッチします。

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

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

-print0
    このプライマリは常に真となります。 -print とほぼ同じですが、対象となっているファイルのパス名を標準出力に出力したあと、 null 文字を出力します。

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

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

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

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

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

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

演算子
以下の演算子を使って、プライマリを組み合わせることができます。 演算子は優先順位が降順になるように並べてあります。

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

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

expression1 -and expression2

expression1 expression2
    -and 演算子は論理積 (AND) 演算子です。2 つの式を並べても同じ意味になるので、明示する必要はありません。 両方の式が真のとき、真になります。もし最初の式が真でないならば、 2 番目の式は実行されません。

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

使用例

以下は、コマンドラインへのタイプ例です:

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), stat(2), fts(3), getpwent(3), getgrent(3), strmode(3), symlink(7)

規格
find ユーティリティの文法は p1003.2 で規定された文法のスーパセットです。

各オプションと -follow, -fstype, -inum, -links, -ls, -print0 のプライマリは p1003.2 からの拡張です。

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

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

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

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

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