FIND(1)

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

書式
find [-H | -L | -P] [-EXdsx] [-f pathname] [pathname ...] expression

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

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

-E  -regex および -iregex のオプションの後の正規表現を、 基本正規表現 (BRE) の代りに拡張 (最近の) 正規表現として解釈します。 re_format(7) マニュアルページは、両方のフォーマットを完全に解説しています。

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

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

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

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

    ちゃんと動作する代案として、 -print0 プライマリを “xargs -0” と共に使用することを検討すると良いかもしれません。

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

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

-s  辞書編集上の順に、 すなわち各ディレクトリ内においてアルファベット順に、 ファイル階層を find に辿らせます。 注: ‘find -s’ と ‘find | sort’ は異なった結果となる場合があります。

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

プライマリ

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

-anewer file
    -neweram と同じです。

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

    単位を指定する場合、最後にファイルがアクセスされた時刻と、 find を起動した時刻との差が正確に n 単位であれば、真とします。 可能な時間の単位は次の通りです:

    s   秒
    m   分 (60 秒)
    h   時間 (60 分)
    d   日 (24 時間)
    w   週 (7 日)

    いくつもの単位を組み合わせて 1 個の -atime 引数に使用可能であり、例えば “-atime -1h30m” とできます。 単位指定は、 + または - の修正子と組み合わせた場合のみ、おそらく有用でしょう。

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

-cnewer file
    -newercm と同じです。

-ctime n[smhdw]
    単位を指定しない場合、最後にファイルのステータスが変更された時刻と、 find を起動した時刻の差 (24 時間単位で切り上げます) が n 日であれば、真とします。 単位を指定する場合、最後にファイルのステータスが変更された時刻と、 find を起動した時刻との差が正確に n 単位であれば、真とします。 サポートされている時間の単位については、 -atime プライマリの記述を参照してください。

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

-depth
    常に真です。 -d オプションと同じです。 find を cpio(1) と共に使用する場合、 普通ではないパーミッションのディレクトリ中のファイルを処理するために、 -depth が有用です。

-empty
    現在のファイルまたはディレクトリが空の場合、真となります。

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

-exec utility [argument ...] {} +
    -exec と同じですが、各 utility の起動において “{}” はなるべく多くのパス名と置き換えられます。 この動作は xargs(1) のものに似ています。

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

-flags [-|+]flags,notflags
    フラグは、シンボル名 ( chflags(1) 参照) で指定します。 フラグの前に "no" を付けると ( "nodump" は除きます)、 notflags と呼ばれます。 flags にあるフラグは設定されていることが検査され、 notflags にあるフラグは設定されていないことが検査されます。 これは、設定されているモードビットのみをユーザが指定可能な -perm とは異なることに注意してください。

    フラグの前にダッシュ (“-”) が付く場合、このプライマリは、ファイルのフラグビットのうち少なくとも flags 中の全ビットが設定されていて、 notflags 中のどのビットも設定されていない場合に真になります。 フラグの前にプラス (“+”) が付く場合、このプライマリは、ファイルのフラグビットのうち flags のいずれかのビットが設定されているか、 notflags のいずれかのビットが設定されていない場合に真になります。 どちらでもない場合、このプライマリは、 flags のビットがファイルのフラグビットに完全に適合し、 flags のいずれもが notflags に適合しない場合に真になります。

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

        sysctl vfs

    さらに、2 つの 擬似タイプ “local” と “rdonly” があります。 前者は、 find を実行しているシステム上に物理的にマウントされているファイルシステムです。 後者は、読み取り専用でマウントされているファイルシステムです。

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

-iname pattern
    -name に似ていますが、大文字小文字を区別せずにマッチします。

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

-ipath pattern
    -path に似ていますが、大文字小文字を区別せずにマッチします。

-iregex pattern
    -regex に似ていますが、大文字小文字を区別せずにマッチします。

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

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

-maxdepth n
    現在のファイルのツリーにおける深さが n 以下である場合、真になります。

-mindepth n
    現在のファイルのツリーにおける深さが n 以上である場合、真になります。

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

-mnewer file
    -newer と同じです。

-mtime n[smhdw]
    単位を指定しない場合、最後にファイルが修正された時刻と、 find を起動した時刻との差(24 時間単位で切り上げます)が n 日であれば、真とします。 単位を指定する場合、最後にファイルが修正された時刻と、 find を起動した時刻との差が正確に n 単位であれば、真とします。 サポートされている時間の単位については、 -atime プライマリの記述を参照してください。

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

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

-newerXY file
    現在のファイルの最終アクセス時刻 (X=a) ・ステータス修正時刻 (X=c) ・内容修正時刻 (X=m) が、 file の最終アクセス時刻 (Y=a) ・ステータス修正時刻 (Y=c) ・内容修正時刻 (Y=m) より新しい場合は、真となります。 さらに Y=t の場合、 file は代りに、 cvs(1) が理解する直接的な時刻指定として解釈されます。 -newermm は -newer と同じであることに注意してください。

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

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

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

-okdir utility [argument ...];
    -okdir プライマリは、 -execdir プライマリと同様ですが、 -ok プライマリの解説に該当する部分が異なります。

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

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

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

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

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

-regex pattern
    ファイルのパス全体が、正規表現 pattern にマッチする場合、真になります。 ファイル名 “./foo/xyzzy” にマッチさせるには、 正規表現 “.*/[xyz]*” や “.*/foo/.*” が使えますが、 “xyzzy” や “/foo/” は使えません。

-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
-false expression
-not 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 / \! -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” である、全ファイルを表示します。

find . -newerct '1 minute ago' -print
    inode 修正時刻が現在から 1 分以内の全ファイルを表示します。

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

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

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

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

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

-E オプションは、 grep(1) および sed(1) の類推から実装されました。

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

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

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

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