FIND(1)

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

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

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

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

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

-H  コマンド行で指定したシンボリックリンクそれぞれに対する ファイル情報とファイルタイプ ( stat(2) 参照) は、シンボリックリンク自体ではなく、 リンク先のファイルのものとなるようにします。 もしリンク先のファイルがなければ、 シンボリックリンク自体のものを使用します。 コマンド行で直接指定されたのではない シンボリックリンクのファイル情報は、 シンボリックリンク自体のものを使用します。

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

    このオプションは、もはや推奨されない -follow プライマリと等価です。

-P  シンボリックリンクそれぞれに対する ファイル情報とファイルタイプ ( stat(2) 参照) は、シンボリックリンク自体のものとなるようにします。 これがデフォルトです。

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

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

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

    このオプションは p1003.1-2001 の -depth プライマリと等価です。 -d は、 find を cpio(1) とともに使用する場合、 cpio(1) が通常でないパーミッションを持つディレクトリに存在する ファイルを処理する際に有益です。 このオプションにより、ファイルをディレクトリに置いている間は 書き込み許可が保持され、その後、最後にディレクトリのパーミッションが 設定されることが保証されます。

-f  find が探索するファイル階層を指定します。 ファイル階層は、本オプションの直後にオペランドとして続けて 指定することもできます。

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

-x  ディレクトリツリーを下って行くとき、下り始めのファイルが存在する デバイスのデバイス番号と異なるデバイス番号を持つディレクトリには 下らないようにします。

    このオプションは、廃止された -xdev プライマリと同等のものです。

プライマリ

-acl
    他のオプションと組み合わせて、 拡張 ACL 属性を持つファイルの場所を示します。 これ以上の情報については acl(3) を参照してください。

-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 オプションと同じです。

-depth n
    探索の出発点からの深さが n である場合、真となります。

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

-exec utility [argument ...];
    utility で指定した名前のプログラムを実行し、終了コードが 0 の場合、真とします。 argument は、utility への引数として渡されます。 この指定は、最後に必ずセミコロン (“”); をつけてください。 find をシェルから起動する場合、 そのシェルがセミコロンを制御オペレータと解釈する場合には、 セミコロンをクォートする必要があるかもしれません。 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 ディレクトリレベルまで下ります。 -maxdepth プライマリが指定されている場合、(たとえ、通常なら評価されない場合でも) 式全体に適用されます。 -maxdepth 0 は、探索全体をコマンド行引数の範囲に制限します。

-mindepth n
    常に真になります。 レベルが n 未満の場合、一切のテストとアクションは適用されません。 -mindepth プライマリが指定されている場合、(たとえ、通常なら評価されない場合でも) 式全体に適用されます。 -mindepth 1 は、コマンド行引数以外のすべてを処理します。

-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 が偽なら、真となります。

expression -and expression
expression expression
    -and 演算子は論理積 (AND) です。 式 2 個を並置することが意味するところとして、 この演算子をわざわざ指定する必要はありません。 両方の式がともに真のとき、この式の評価が真になります。 最初の式が偽ならば、2 番目の式は評価されません。

expression -or expression
    -or 演算子は論理和 (OR) です。 最初の式が真か、2 番目の式が真であるとき、この式の評価が真になります。 最初の式が真ならば、2 番目の式は評価されません。

演算子とプライマリのすべては find の個別の引数として与える必要があります。 プライマリ自身が引数を取る場合、その引数も 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” である、全ファイルを表示します。

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

find / -type f -exec echo {} \;
    ファイルすべてのリストを出力するために、 echo(1) コマンドを使います。

find -L /usr/ports/packages -type l -delete
    /usr/ports/packages にある壊れたシンボリックリンクのすべてを削除します。

find /usr/src -name CVS -prune -o -depth +6 -print
    作業ディレクトリ /usr/src の中で、少なくとも 7 レベル以上の深さのファイルとディレクトリを 探索します。

find /usr/src -name CVS -prune -o -mindepth 7 -print
    これは 1 つ前の例と同等ではありません。 というのは、 -prune がレベル 7 以下では評価されないからです。

互換性
-follow プライマリは廃止されました。 かわりに -L オプションを使用して下さい。 詳しくは下記の 規格 セクションを参照して下さい。

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

規格
find ユーティリティの文法は p1003.1-2001 の仕様で決められた文法のスーパセットです。

-H, -L を除く全 1 文字オプションと -iname, -inum, -print0, -delete, -ls, -regex のプライマリは p1003.1-2001 に対する拡張です。

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

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

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

-E オプションは、 grep(1) および sed(1) の同等のオプションから着想を得て実装されました。

歴史
find コマンドは AT&T UNIX ではじめて出現しました。

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

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

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

(上で記したように) -mindepth と -maxdepth プライマリは実際にはグローバルオプションです。 これらをオプションらしく見えるオプションと置き換えるべきでしょう。