EN JA
FIND(1)
FIND(1) FreeBSD General Commands Manual FIND(1)

名称

findファイル階層を歩き回る

書式

find [ -H | -L | -P][ -EXdsx][ -f path] path ... [ expression]

find [ -H | -L | -P][ -EXdsx] -f path [ path ...][ expression]

解説

find ユーティリティは、階層の各ファイルに関して (下記にリストされた“プライマリ”と“オペランド”からなる) expression を評価して、リストされた各 path に対してディレクトリ階層を再帰的に降下します。

オプションは、次の通りです:

-E
基本的な正規表現 (BRE) ではなく拡張された (現代的な) 正規表現として -regex-iregex プライマリが続く正規表現を解釈します。 re_format(7) マニュアルページは、両方の形式について完全に記述しています。
-H
コマンド行で指定したシンボリックリンクそれぞれに対するファイル情報とファイルタイプ ( stat(2) 参照) は、シンボリックリンク自体ではなく、リンク先のファイルのものとなるようにします。もしリンク先のファイルがなければ、シンボリックリンク自体のものを使用します。コマンド行で直接指定されたのではないシンボリックリンクのファイル情報は、シンボリックリンク自体のものを使用します。
-L
シンボリックリンクそれぞれに対するファイル情報とファイルタイプ ( stat(2) 参照) は、シンボリックリンク自体ではなく、リンク先のファイルのものとなるようにします。もしリンク先のファイルがなければ、シンボリックリンク自体のものを使用します。

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

-P
シンボリックリンクそれぞれに対するファイル情報とファイルタイプ ( stat(2) 参照) は、シンボリックリンク自体のものとなるようにします。これがデフォルトです。
-X
xargs(1) と組み合わせた際に find を安全に使えるようにします。 xargs(1) がデリミタ文字として扱う文字がファイル名に含まれる場合、診断メッセージを標準エラー出力に表示して、そのファイルをスキップします。デリミタ文字は、シングルクォート (“ ' ”)、ダブルクォート (“ " ”)、バックスラッシュ (“ \”)、空白、タブ、改行文字を含んでいます。

しかしながら、有効な代替物として“ xargs -0”と合わせる -print0 プライマリを考慮してみてください。

-d
find は、深さ優先の横断 (traversal) を実行します。

このオプションは、 IEEE Std 1003.1-2001 (“POSIX.1”) によって指定される -depth プライマリの BSD 特有の同等プライマリです。詳細については、 プライマリ の記述を参照してください。

-s
find は、辞書編集順、すなわち、各ディレクトリ内のアルファベット順、でファイル階層を横断します。注: ‘ find -s’と‘ find | sort’は、異なる結果となるかもしれません。
-x
降下が始まるファイルのデバイス番号と異なるデバイス番号があるディレクトリに find が下降することを防ぎます。

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

プライマリ

数字の引数にとるすべてのプライマリによって、プラス符号 (“ +”) またはマイナス符号 (“ -”) を数字の前につけることができます。前につけられたプラス符号は、“n より大”を意味し、前につけられたマイナス符号は、“n より小”を意味し、どちらでもなければ、“正確に n”を意味します。
-Bmin n
ファイルの inode 作成時刻と find が開始された時刻の間の差が、分単位に切り上げられて、 n 分であるなら、真です。
-Bnewer file
-newerBm と同じです。
-Btime n[ smhdw]
単位が指定されないなら、ファイルの inode 作成時刻と find が開始された時刻の間の差が、24 時間単位に切り上げられて、 n 日であるなら、このプライマリは、真と評価します。

単位が指定されるなら、ファイルの inode 作成時刻と find が開始された時刻の間の差が、正確に n 単位であるなら、このプライマリは、真と評価します。サポートされている時間の単位の情報については、 -atime のプライマリの説明を参照してください。

-acl
他のプライマリと組み合わせて、拡張 ACL 属性を持つファイルの場所を示します。これ以上の情報については、 acl(3) を参照してください。
-amin [ -| +] n
ファイルの最終アクセス時刻と find が開始した時刻との差 (次の分まで切り上げられる) が n (+ n) より大きか、 n (- n) 未満か、または正確に n 分前であるなら、真です。
-anewer file
-neweram と同じです。
-atime n[ smhdw]
単位を指定しない場合、最後にファイルがアクセスされた時刻と、 find を起動した時刻との差 (24 時間単位で切り上げます) が n 日であれば、真です。

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

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

-atime 引数といくつもの単位を組み合わせることができます、例えば、“ -atime -1h30m”。単位は、 + または - 修飾子とともに使用される場合のみ役に立ちます。

-cmin [ -| +] n
ファイルのステータスの情報の最後の変更の時刻と find が開始した時刻との差 (次の分まで切り上げられる) が n (+ n) より大きか、 n (- n) 未満か、または正確に n 分前であるなら、真です。
-cnewer file
-newercm と同じです。
-ctime n[ smhdw]
単位を指定しない場合、最後にファイルのステータスが変更された時刻と、 find を起動した時刻の差 (24 時間単位で切り上げます) が n 日であれば、真です。

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

-d
移植性のない、 depth の BSD 特有のバージョン。 GNU find は、 FreeBSD find の間違われたエミュレーションの主要な事項として、これを実装しています。
-delete
見つけたファイルやディレクトリを消去します。常に真を返します。現在の作業ディレクトリから find は、再帰的にディレクトリ階層を下ります。セキュリティ上の理由から、“ .”からの相対パス名に“ /”文字を含むファイル名のファイルを消去しようとはしません。このオプションにより暗黙のうちに深さ優先の処理が指定されます。 -delete プライマリは、それが空でないなら、ディレクトリを削除しません。次のシンボリックリンクは、このオプションと互換がありません。
-depth
常に真です。移植性のない、 -d オプションと同じです。 find は、深さ優先の横断を実行します、すなわち、ディレクトリは、ポスト順 (post-order) で訪問され、ディレクトリのすべてのエントリは、ディレクトリ自体の前に作用されます。デフォルトで、 find は、先行順序 (pre-order) でディレクトリを訪問します、すなわち、それらの内容の前です。デフォルトは、深さ優先で横断 しない ことに注意してください。

通常でないパーミッションでディレクトリに含まれているファイルを処理するために findcpio(1) で使用されるとき、 -depth プライマリを役に立てます。ディレクトリにファイルを置いている間に書き込みパーミッションがあることを保証し、次に、最後のものとしてディレクトリのパーミッションを設定します。

-depth n
検索の出発点からの深さが n である場合、真となります。
-empty
現在のファイルまたはディレクトリが空の場合、真となります。
-exec utility [ argument ...] ;
utility で指定した名前のプログラムを実行し、終了コードが 0 の場合、真です。 argument は、utility への引数として渡されます。この指定は、最後に必ずセミコロン (“ ;”) をつけてください。 find をシェルから起動する場合、そのシェルがセミコロンを制御オペレータと解釈する場合には、セミコロンをクォートする必要があるかもしれません。 utility もしくは argument の指定のなかで“ {}”が使われていた場合は、その部分が、現在 find が対象としているファイルのパス名に置き換えられます。ただし、 utility が実行されるときのカレントディレクトリは、 find が起動されたディレクトリのままです。 utilityargument は、シェルのパターンと構造の更なる展開対象とはなりません。
-exec utility [ argument ...] {} +
-exec と同じですが、各 utility の起動において“ {}”は、なるべく多くのパス名と置き換えられます。この動作は、 xargs(1) のものに似ています。
-execdir utility [ argument ...] ;
-execdir プライマリは、 -exec プライマリと同様ですが、 utility が現在のファイルを持つディレクトリにおいて実行される点が異なります。文字列“ {}”に対して置換されるファイル名は、適切ではありません。
-execdir utility [ argument ...] {} +
{}”が utility の各呼び出しにためにできるだけ多くのパス名と置き換えられることを除いて、 -execdir と同じです。この振る舞いは、 xargs(1) のものと同様です。
-flags [ -| +] flags, notflags
フラグは、シンボル名 ( chflags(1) 参照) で指定します。フラグの前に“ no”を付けると (“ nodump”は、除きます)、 notflags と呼ばれます。 flags にあるフラグは、設定されていることが検査され、 notflags にあるフラグは、設定されていないことが検査されます。これは、設定されているモードビットのみをユーザが指定可能な -perm とは、異なることに注意してください。

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

-fstype type
対象ファイルが格納されているファイルシステムのタイプが、 type で指定されたものである場合に真となります。システムで利用可能なファイルシステムのタイプを調べるために lsvfs(1) コマンドを使用することができます。さらに、2 つの擬似タイプ“ local”と“ rdonly”があります。前者は、 find を実行しているシステム上に物理的にマウントされているファイルシステムです。後者は、読み込み専用でマウントされているファイルシステムです。
-gid gname
GNU find との互換性のための -group gname と同じもの。 GNU find は、 gname が数値であるという制限を課しますが、 find は、そうしません。
-group gname
ファイルが gname で指定したグループに属している場合、真になります。 gname が数字で、そのようなグループ名がない場合は、 gname をグループ ID として扱います。
-ignore_readdir_race
ファイルまたはディレクトリは、ディレクトリから名前を読み込んだ後に削除されるので、エラーを無視します。このオプションは、開始点で生じるエラーに影響しません。
-ilname pattern
-lname に似ていますが、比較は、大文字と小文字を区別しません。これは、GNU find の拡張です。
-iname pattern
-name に似ていますが、大文字小文字を区別せずにマッチします。
-inum n
ファイルの inode 番号が n なら、真になります。
-ipath pattern
-path に似ていますが、大文字小文字を区別せずにマッチします。
-iregex pattern
-regex に似ていますが、大文字小文字を区別せずにマッチします。
-iwholename pattern
GNU find との互換性のための -ipath と同じもの。
-links n
ファイルのリンク数が n なら、真になります。
-lname pattern
-name に似ていますが、シンボリックリンクの内容が、ファイル名の代わりにマッチされます。これは、GNU find の拡張です。
-ls
このプライマリは、常に真になります。対象となっているファイルの情報を標準出力に出力します。出力する内容は、inode 番号、 512 バイトブロックでのファイルの大きさ、ファイルのパーミッション、ハードリンクの数、所有者、グループ、バイトで表したファイルの大きさ、最後にファイルが修正された時刻、パス名です。ファイルがブロック特殊ファイルまたはキャラクタ特殊ファイルであるなら、バイトのサイズの代わりにデバイス番号を表示します。ファイルがシンボリックリンクならば、“ ->”の後にリンク先のファイルのパス名を表示します。書式は、“ ls  -dgils”の出力結果と同じです。
-maxdepth n
常に真です。多くてもコマンド行の引数の下の n ディレクトリレベルまで下降します。 -maxdepth プライマリが指定されている場合、(たとえ、通常なら評価されない場合でも) 式全体に適用されます。“ -maxdepth 0”は、検索全体をコマンド行引数の範囲に制限します。
-mindepth n
常に真になります。レベルが n 未満の場合、一切のテストとアクションは、適用されません。 -mindepth プライマリが指定されている場合、(たとえ、通常なら評価されない場合でも) 式全体に適用されます。“ -mindepth 1”は、コマンド行引数以外のすべてを処理します。
-mmin [ -| +] n
ファイルの最終更新時刻と find が開始した時刻との差 (次の分まで切り上げられる) が n (+ n) より大きか、 n (- n) 未満か、または正確に n 分前であるなら、真です。
-mnewer file
-newer と同じです。
-mount
GNU find との互換性のための -xdev と同じもの。
-mtime n[ smhdw]
単位を指定しない場合、最後にファイルが修正された時刻と、 find を起動した時刻との差 (24 時間単位で切り上げます) が n 日であれば、真です。

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

-name pattern
対象ファイルのパス名の最後のファイル名部分が pattern で指定したものとマッチするかどうかを調べ、マッチした場合は、真になります。 pattern としては、シェルで使われるパターンマッチ指定 (“ [”, “ ]”, “ *”と“ ?”) を使用することができます。これらの文字は、バックスラッシュ (“ \”) を前において、パターンマッチ指定ではなく文字として扱う事を明示することができます。
-newer file
対象ファイルの修正日付が、 file で指定したファイルのものより新しい場合は、真になります。
-newer X Y file
現在のファイルの最終アクセス時刻 ( X= a)、inode 作成時刻 ( X= B)ステータス修正時刻 ( X= c)、内容修正時刻 ( X= m) が、 file の最終アクセス時刻 ( Y= a)、inode 作成時刻 ( Y= B)、ステータス修正時刻 ( Y= c)、内容修正時刻 ( Y= m)より新しい場合は、真となります。さらに Y= t の場合、 file は、代りに、 cvs(1) が理解する直接的な時刻指定として解釈されます。 -newermm は、 -newer と同じであることに注意してください。
-nogroup
対象ファイルのグループが unknown の場合、真になります。
-noignore_readdir_race
-ignore_readdir_race の影響をオフに切り替えます。これは、デフォルト振る舞いです。
-noleaf
このオプションは、GNU find の互換性のためのものです。 GNU find では、 find に関連していない最適化を無効にするので、それは、無視されます。
-nouser
対象ファイルの所有者が unknown の場合、真になります。
-ok utility [ argument ...] ;
-ok プライマリは、 -exec とほぼ同じですが、 find は、 utility を実行するかどうかの確認をユーザに求め、端末にメッセージを出力します。返答が肯定 (“ POSIX” locale では、‘ 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
このプライマリは、常に真になります。標準出力に対象となっているファイルのパス名を出力したあと、改行ではなく、 ASCII NUL (ヌル) 文字 (文字コード 0) を出力します。
-prune
このプライマリは、常に真になります。 find は、対象となっているファイル配下のディレクトリに下りないようにします。 -d オプションが指定されている場合は、 -prune プライマリの指定は、無効になります。
-quit
find は、直ちに成功して終了します。
-regex pattern
ファイルのパス全体が、正規表現 pattern にマッチする場合、真になります。ファイル名“ ./foo/xyzzy”にマッチさせるには、正規表現“ .*/[xyz]*”や“ .*/foo/.*”が使えますが、“ xyzzy”や“ /foo/”は、使えません。
-samefile name
ファイルが、 name にハードリンクされているなら、真です。コマンドオプション -L が指定されるなら、ファイルがシンボリックリンクであり、 name を指していても、真です。
-size n[ ckMGTP]
ファイルサイズを 512 バイトのブロック単位で数えたとき (端数は切り上げ)、 n ブロックであれば真になります。 n のあとに c が指定されていた場合は、ファイルサイズが n バイト (文字) であれば真になります。同様に、スケール指示子が n のあとに続いているなら、ファイルのサイズは、次の n のスケールで比較されます:

k
キロバイト (1024 バイト)
M
メガバイト (1024 キロバイト)
G
ギガバイト (1024 メガバイト)
T
テラバイト (1024 ギガバイト)
P
ペタバイト (1024 テラバイト)
-sparse
現在のファイルがスパースファイルであるなら、真、すなわち、バイト単位のサイズに基づいて期待されるよりより少ないブロックを割り付けます。また、これは、ファイルシステムによって圧縮されたファイルと一致するかもしれません。
-type t
ファイルタイプが指定されたタイプに一致すれば真になります。タイプとして、次のような指定が可能です:

b
ブロック型特殊ファイル
c
キャラクタ型特殊ファイル
d
ディレクトリ
f
普通のファイル
l
シンボリックリンク
p
FIFO
s
ソケット
-uid uname
GNU find との互換性のための -user uname と同じもの。 GNU find は、 uname が数値であるという制限を課しますが、 find は、そうしません。
-user uname
ファイルの所有者が、 uname で指定されたユーザと一致すれば真になります。もし uname が数字で、そのようなユーザ名がなければ、 uname は、ユーザ ID が指定されたものとして扱います。
-wholename pattern
GNU find との互換性のための -path と同じもの。

演算子

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

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

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

-false
常に、偽です。
-true
常に、真です。

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

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

演算子とプライマリのすべては、 find の個別の引数として与える必要があります。プライマリ自身が引数を取る場合、その引数も find の個別の引数として与える必要があります。

環境変数

environ(7) で記述されているように、環境変数 LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGESLC_TIMEfind ユーティリティの実行に影響を及ぼします。

使用例

コマンドラインからのタイプ例です。
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 -exec rm -- {} +
/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 オプションを使用して下さい。詳しくは下記の 規格 セクションを参照して下さい。

規格

find ユーティリティの構文は、 IEEE Std 1003.1-2001 (“POSIX.1”) 規格で明記された構文のスーパセットです。

-amin, -anewer, -cmin, -cnewer, -delete, -empty, -fstype, -iname, -inum, -iregex, -ls, -maxdepth, -mindepth, -mmin, -path, -print0, -regex, -sparse と同様に -H-L を除くすべての単一文字のオプションとすべての -B* 作成時刻関連のプライマリは、 IEEE Std 1003.1-2001 (“POSIX.1”) の拡張です。

昔は、 -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 コマンドは、 Version 1 AT&T UNIX ではじめて登場しました。

バグ

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

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

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

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

November 18, 2012 FreeBSD