Provided by: manpages-ja_0.5.0.0.20210215+dfsg-1_all 

名前
find - ディレクトリ階層をたどって、条件を満たすファイルを検索する
書式
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
説明
このマニュアルページは GNU 版 find の使用法を説明している。 GNU 版 find は、指定された探索開始点 (訳注:
探索の始点となるパス。上記書式の starting-point...) 以下のディレクトリツリーを一つづつ探索し、与えられた
式 (訳注: 上記書式の expression) を、優先規則に従いつつ (「演算子」セクションを参照)、 左から右へ評価する
ことによって検索を行う。 式の結果が確定すると (たとえば、and 演算で左辺が偽になった場合や、or 演算で左辺
が真になった場合など)、 find は処理の対象を次のファイル名に移す。 探索開始点が指定されていない場合は、`.'
が指定されたものと見なされる。
もし find を使用しているのが、セキュリティの問題をおろそかにできない環境なら (たとえば、 find を使って探
索しているディレクトリが、自分以外のユーザにも書き込み可能な場合など)、 findutils 関連文書の 「Security
Considerations」の章をお読みになるとよい。 Finding Files という文書で、findutils に同梱されているはずだ
(訳注: info "Finding Files" で読むことができる)。 その文書では、他の点についてもこのマニュアルページより
はるかに詳しい説明や考察が行われているので、 この文書以上に情報源としてお役に立つことだろう。
オプション
-H, -L, -P というオプションは、シンボリックリンクをどう処理するかを決める。 こうしたオプションに続くコマ
ンドライン引き数は、探索対象となるファイル名やディレクトリ名と見なされる。 ただし、それは、`-' で始まる引
き数や、`(' とか `!' という引き数が、続いて現れるまでだ。 そうした引き数、及びそれに続くいかなる引き数
も、何を捜すべきかを記述した式であると解釈される。 探索開始点のパスが一つも指定されていない場合は、カレン
トディレクトリ以下が探索の対象になる。 また、式が一つも指定されていない場合は、-print が式として使用され
る (もっとも、いかなる場合でも、-print の代わりに -print0 の使用を考えた方が多分よいだろうが)。
このマニュアルページで説明する「オプション」には、式の一部として使われるものもある。 そうしたオプション
は、find の動作を制御するものであり、指定する位置は、探索開始点の最後のパス名のすぐ後になる。 それに対し
て、-H, -L, -P, -D, -O という五つの「本来」のオプションは、指定するなら、最初のパス名の前で指定しなければ
ならない。 なお、ダッシュを二個重ねた -- を使用して、後に続く引き数はオプションではないと明示することも可
能だ (それでも、探索開始点となるパス名のリストでワイルドカードを使用するならば、 始点のすべてが `./' か
`/' で始まるようにしておいた方が、たいてい無難である)。
-P シンボリックリンクをまったくたどらない。これがデフォルトの動作である。find がファイルの情報を調べ
たり表示したりする際に、そのファイルがシンボリックリンクだったら、 そのシンボリックリンクそのもの
のプロパティから取得した情報が使用されることになる。
-L シンボリックリンクをたどる。find がファイルの情報を調べたり表示したりする際に、 リンク先のファイル
のプロパティから取得した情報が使用されることになり、 リンクそのものの情報は利用されない (ただ
し、シンボリックリンクがリンク切れしていたり、 find がリンク先のファイルを調べることができなかった
場合は除く)。 このオプションを使用すると、自動的に -noleaf が指定される。 後で -P オプションを指定
し直しても、-noleaf は依然として有効なままである。 -L が有効になっているとき、find が探索中にサブ
ディレクトリを指すシンボリックリンクに出会うと、 そのシンボリックリンクが参照しているサブディレク
トリが探索される。
-L オプションが有効だと、述語 -type は (訳注: 「述語 (predicate)」とは、式を構成する基本要素、すな
わち、オプション、検査、 アクションのこと)、シンボリックリンクそのものに対してではなく、 常にシン
ボリックリンクが指しているファイルのタイプに対してマッチを行うようになる (シンボリックリンクがリン
ク切れしている場合を除く)。 find の実行中にシンボリックリンクがリンク切れになるようなアクションを
行うと (たとえば、-delete を使うと)、動作がわけのわからないものになるかもしれない。 -L を使用する
と、述語 -lname や -ilname は常に偽を返す。
-H コマンドライン上で指定された引き数を処理するとき以外、シンボリックリンクをたどらない。 すなわ
ち、原則として、 find がファイルの情報を調べたり表示したりする際に、 シンボリックリンクそのものの
プロパティから取得した情報が使用されることになる。 ただし、この動作には例外が一つあり、それは、コ
マンドラインで指定されたファイルがシンボリックリンクであり、そのリンクが解決できる場合だ。 その場
合は、リンク先が何であれ、そこから取得した情報が使用され (つまり、リンクがたどられる)、シンボリッ
クリンク自体の情報は、リンク先のファイルを調べることができなかったときの、控えの情報として使用され
る。 なお、-H が有効なとき、コマンドラインで指定されたパスの中に (訳注: つまり探索開始点の中に)
ディレクトリへのシンボリックリンクがあった場合も、そのディレクトリの中身が調べられることになる
(もっとも、-maxdepth 0 を指定すれば、 当然ながら、この動作は抑制されることになるだろうが)。
一つ以上の -H, -L, -P を指定した場合は、後のものが前のものを上書きする。 従って、コマンドラインで最後に指
定されたものが、効果を持つわけだ。 -P はデフォルトなので、-H や -L を指定しないかぎり、-P オプションが有
効になっていると考えるべきである。
GNU find は実際の探索に取りかかる前にコマンドラインの処理を行うが、 その際 stat システムコールを使って
ファイルの情報を調べることがよくある。 上述のオプションは、そのとき引き数がどう処理されるかにも影響を与え
る。 具体的に説明しよう。いくつかの検査では、コマンドラインで指定したファイルを目下検査の対象になっている
ファイルと照合する。 いづれの検査でも、コマンドラインで指定したファイルは、情報が調べられた後、そのプロパ
ティのいくつかが保存されることになる。 名前を指定したファイルが実際にはシンボリックリンクであるとき、-P
オプションが有効な場合は (すなわち、 -H と -L のどちらのオプションも指定されていない場合は)、 照合に使用
される情報は、シンボリックリンクのプロパティから取得したものである。 それ以外の場合、使用されるのはリンク
先のファイルのプロパティから取得した情報だ。 ただし、find が (たとえば、権限が不十分だとか、リンク先の
ファイルが存在しないとかの理由で) リンクをたどれない場合は、リンクそのもののプロパティが使われることにな
る。
-H や -L オプションが有効な場合は、 -newer の引き数として指定されたのがシンボリックリンクなら、 その参照
がたどられて、リンク先のファイルからタイムスタンプが取得されることになる。 同じことが、 -newerXY,
-anewer, -cnewer についても言える。
式の一部として使用される -follow オプションには -L と同様の効果があるが、 それが現れた位置から有効になる
という点が異なる (すなわち、-L が使われずに、-follow が使われた場合、 -follow より後で指定されたいかなる
シンボリックリンクも参照がたどられるが、 その前に指定されたシンボリックリンクは参照がたどられない)。
-D debugoptions
診断用の情報を出力する。find が期待どおりに動いてくれないとき、 問題の原因追求に役立つことがあ
る。デバッグオプションを複数指定するときは、コンマで区切る。 findutils のバージョンの間で、デバッ
グオプションの互換性は保証されていない。 有効な全デバッグオプションのリストについては、find -D
help の出力を見るとよい。 有効なデバッグオプションの中には、以下のものがある。
help デバッグ用オプションを説明する。
tree 式の構造 (expression tree) をオリジナルな形と最適化した形で示す。
stat stat や lstat システムコールを使ってファイルを調べたとき、メッセージを表示する。 find プロ
グラムは、そうしたシステムコールの回数を最少にしようとする。
opt 式の構造 (expression tree) の最適化に関する診断情報を表示する。-O オプションを参照。
rates 各述語が何回成功し、何回失敗したかを示す情報を要約して表示する。
-Olevel
問い合わせの最適化を有効にする。find プログラムは、全体的な効果を維持しつつ、検査の順序を並べ替え
ることによって、実行速度を上げる。 すなわち、付加的な作用のある述語同士については、相互の相対的な
順序を変更しないということだ。 各最適化レベルで行われる最適化は、以下のとおりである。
0 最適化レベル 1 と同じである。
1 これはデフォルトの最適化レベルであり、伝統的な動作に当たる。 式を並べ替えるとき、ファイル名
にのみ基づいた検査 (たとえば、 -name や -regex) が先に実行されるようにする。
2 検査 -type や -xtype の実行は、ファイル名のみに基づいたいかなる検査よりも後になるが、 inode
から情報を取得する必要があるどんな検査よりも先になる。 最近の Unix には readdir() 関数で
ファイルタイプを取得できるものが多いので、 こうした述語は、stat 関数でファイルの情報を取得
するところから始めなければならない述語よりも、評価に時間がかからないのである。 な
お、-fstype FOO という述語を使った場合に、 find の起動時に既知になっていない (すなわ
ち、`/etc/mtab' に存在しない) ファイルシステムのタイプ FOO を指定すると、-fstype FOO は
-false と同じことになる。
3 この最適化レベルでは、コストに基づいた問い合わせの最適化を徹底して行う機能が有効になる。 検
査の順序が必要なら変更され、コストのかからない (すなわち、速い) 検査が先に行われて、よりコ
ストのかかる検査が後回しにされる。 コストがほぼ同じ場合には、その述語が真を返しそうか、偽を
返しそうかによって、評価の順番が変わってくる。 or 演算では、真を返しそうな述語が先に評価さ
れ、and 演算では、偽になりそうな述語が先に評価されるのである。
コストに基づいた最適化機能は、ある検査が真を返す確率について一定の考えを持っている。 場合によって
は、その確率について、問題のテストの特性が考慮されることもある (たとえば、 -type f は、 -type c よ
りも、真になる可能性が高いと見なされる)。 コストに基づいた最適化機能は、現在のところその効果を評価
中である。 もし、それによって find の性能が実際に向上することがなければ、捨てられることになるだろ
う。 反対に、信頼性があり、問題を起こしにくく、効果的であることがはっきりした最適化は、 そのうち下
位の最適化レベルでも採用されるかもしれない。とは言え、リリース 4.3.x のシリーズでは、 デフォルトの
動作 (すなわち、最適化レベル 1) を変更する予定はない。 なお、findutils のソースに付属するテスト集
は、そのテストのすべてを各最適化レベルの find で実行して、どの最適化レベルでも結果が同じになること
を保証している。
式 (EXPRESSION)
コマンドライン上で探索開始点 (starting-point) のリストの後ろに続く部分は、「式 (expression)」である。 式
は、言わば問い合わせの細目のようなものであり、 どういうファイルがマッチするのかと、そのマッチしたファイル
をどう処理するのかを記述している。 式は一連の要素からなっている (訳注: このマニュアルでは、そうした式の要
素、 特にオプション、検査、アクションをまとめて「述語 (predicate)」と呼んでいる)。
検査 (Tests)
検査は、通常、考慮の対象になっているファイルの何らかのプロパティ (property、属性、性状) に基づい
て、真または偽の値を返す。たとえば、-empty という検査は、対象になっているファイルが空の場合にの
み、真になる。
[訳注]: バージョン 4.4.2 までの翻訳では、この Tests を「判別式」と訳してきたが、今回は素直に「検
査」と訳すことにした。同じものである。
アクション (Actions)
アクションには付加的な作用があり (たとえば、標準出力に何かを表示するなど)、 通常、その作用の実行に
成功したか失敗したかに基づいて、真または偽を返す。 たとえば、-print というアクションは、対象になっ
ているファイルの名前を標準出力に表示する。
グローバルオプション (Global options)
グローバルオプションは、検査やアクションがコマンドライン中のどこで指定されていても、 その動作に影
響を与える。また、グローバルオプションは、常に真を返す。 たとえば、-depth オプションを指定する
と、find は、ファイルシステムをたどるとき、 深い方から先に (depth-first order) 処理していくことに
なる (訳注: 下記の -depth の説明を参照)。
位置オプション (Positional options)
位置オプションが影響を与えるのは、それより後に続く検査やアクションに対してだけである。 また、位置
オプションは常に真を返す。たとえば、-regextype オプションは、その位置が意味を持ち、 コマンドライン
上でそれより後に現れる正規表現に対して、正規表現のどの方言かを指定することになる。
演算子 (Operators)
演算子は、式を構成する事項同士を結びつけるものである。 演算子には、-o (論理 OR を意味する) や -a
(論理 AND を意味する) などがある。 演算子がないところには、-a があるものと見なされる。
式の中に -prune や -print 以外のアクションがまったく存在しない場合は、 式全体の結果が真になったすべての
ファイルに対して -print が実行される。
-delete というアクションはオプションのようにも働く (自動的に -depth を有効にするからである)。
位置オプション
位置オプションは、常に真を返す。 位置オプションが影響を与えるのは、コマンドライン上でそれより後に現れる検
査に対してだけである。
-daystart
-amin, -atime, -cmin, -ctime, -mmin, -mtime において、今日 (すなわち 0 日前) の始まりを今現在から
24 時間前ではなく、コマンド実行当日の 0 時にする。 このオプションが影響を及ぼすのは、コマンドライ
ンで自分より後に指定された検査に対してだけである。
[訳注]: -amin, -cmin, -mmin のことも考慮するなら、「デフォルトでは時間を計算するときの基点を今現在
に置くが、 -daystart を指定すると、時間計算の基点が今日の 24:00 になる」と考えれば、 わか
りやすいかもしれない。
-follow
非推奨である。 -L オプションを代わりに使う方がよい。 シンボリックリンクをたどる。 -noleaf が自動的
に設定される。 -follow オプションが影響を及ぼすのは、コマンドラインで自分より後に指定された検査に
対してだけである。 -H や -L オプションが指定されていない場合、-follow オプションの位置によって述語
-newer の動作が変わってくる。 -newer が -follow の後に来れば、-newer の引き数として指定されたいか
なるファイルも、それがシンボリックリンクなら、リンクをたどられることになるわけだ。 同じことが
-newerXY, -anewer, -cnewer についても言える。 同様に、述語 -type も、シンボリックリンクそのもので
はなく、 必ずシンボリックリンクが参照しているファイルのタイプに対してマッチを行うようになる。
-follow を使用すると、述語 -lname と -ilname は常に偽を返す。
-regextype type
検査 -regex と -iregex が理解する正規表現の文法を変更する。 このオプションよりコマンドラインの後方
で指定する -regex などに対して効果がある。 どういう正規表現のタイプが使えるかを知るに
は、-regextype help を使用すればよい。 様々なタイプの正規表現が、どんなもので、どこが違うかについ
ては、find の Texinfo 文書に説明がある (「関連項目」を参照)。
-warn, -nowarn
警告メッセージの表示、非表示を切り替える。 ここで言う警告とは、もっぱらコマンドラインの使用法に関
するものであり、find がディレクトリを探索中に出会うかもしれない何らかの状況に関するものではない。
デフォルトの動作は、標準入力が tty であれば、-warn であり、 それ以外の場合は、-nowarn である。 コ
マンドラインの使用法に関する警告メッセージが生ずる場合でも、find の終了ステータスは影響を受けな
い。 なお、環境変数 POSIXLY_CORRECT が設定され、しかも -warn まで指定された場合に、 警告を出すとし
ても、どの警告を出すかは決まっていない (訳注: POSIX の規定では、find は基本的に、エラーメッセージ
は出しても、警告メッセージは出さないことになっている。 だから、POSIXLY_CORRECT と -warn の両方を指
定するのは、使用法に混乱があるのである。 ちなみに、手元の 4.6.0 では警告は出ない)。
グローバルオプション
グローバルオプションは常に真を返す。 グローバルオプションは、コマンドライン上でそれよりも前にある検査に対
しても効果を持つ。 混乱を避けるためには、グローバルオプションは、コマンドライン上で、探索開始点のリストの
後ろ、 検査や位置オプションやアクションが現れる前に指定すべきである。 グローバルオプションを他の場所で指
定すると、find は「混乱の元になりかねない」旨の警告メッセージを出す。
グローバルオプションの位置は、探索開始点のリストより後ろである。だから、-L などとは、まったく別種のオプ
ションである。
-d -depth と同じ。FreeBSD, NetBSD, MacOS X, OpenBSD との互換性のためにある。
-depth ディレクトリそのものより先に、ディレクトリの中身を処理する。 アクション -delete を使用する
と、-depth オプションも自動的に設定される。
-help, --help
find のコマンドラインの使用法をざっと説明して終了する。
-ignore_readdir_race
通常、find は stat 関数でファイル情報を取得できなかったとき、 エラーメッセージを出すことになってい
る。 ところが、このオプションを指定した場合は、 find がディレクトリからファイル名を読み込んでか
ら、そのファイルに対して stat 関数を実行しようとするまでの間に、ファイルが消去されても、エラーは表
示されない。 この動作は、コマンドラインで名前を指定したファイルやディレクトリに対しても適用され
る。 このオプションは コマンドラインを読み込む際に有効になるので、 ファイルシステムのある部分をこ
のオプションを有効にして探索し、 別の部分はこのオプションを無効にして探索するといったことはできな
い (そうしたことをやりたかったら、 find コマンドを二回実行する必要があるだろう。 一回目は、このオ
プションを付けて、もう一回はこのオプションなしで)。
-maxdepth levels
探索開始点から最大 levels 段階下のディレクトリまで探索する (levels は非負の整数)。 -maxdepth 0 を
指定すると、検査やアクションの対象になるのは、探索開始点だけになる。
-mindepth levels
探索開始点から少なくとも levels 段階ディレクトリを下降するまで、いかなる検査やアクションも行わない
(levels は非負の整数)。 -mindepth 1 を指定すると、探索開始点を除くすべてのファイルを処理することに
なる。
-mount ほかのファイルシステムにあるディレクトリを探索しない。これは -xdev の別名であり、系統の違う find
との互換性のためにある。
-noignore_readdir_race
-ignore_readdir_race の効果を無効にする。
-noleaf
「ディレクトリのハードリンク数から 2 を引いたものが、そのディレクトリに含まれるサブディレクトリの
数である」とする最適化動作を行わない。 このオプションが必要になるのは、ディレクトリとリンクの関係
について Unix の流儀に従わないファイルシステムを探索するときだ。たとえば、CD-ROM や MS-DOS のファ
イルシステムとか、AFS ボリュームのマウントポイントなどを探索するときである。 通常の Unix ファイル
システムでは、各ディレクトリは少なくとも 2 個のハードリンクを持っている。 ディレクトリ名のエントリ
と、そのディレクトリ中の `.' エントリである。 さらに、そのディレクトリにサブディレクトリがあれば、
サブディレクトリそれぞれに、親ディレクトリにハードリンクした `..' エントリが存在する。 そこ
で、find としては、ディレクトリを調べる際に、ディレクトリのハードリンク数より 2 だけ少ない数のサブ
ディレクトリを stat 関数で調べた時点で、ディレクトリ中の残りのエントリはディレクトリではない (ディ
レクトリツリー中の枝ではなく、「葉っぱ (leaf)]」ファイルである) とわかるわけだ。 もし、調べるのが
ファイル名だけで充分なら、ファイルに対して stat 関数を実行する必要はもうない。 そこで、この最適化
動作によって、検索速度がいちじるしく向上するわけである。
-version, --version
find のバージョンを表示して終了する。
-xdev ほかのファイルシステムにあるディレクトリを探索しない。
検査 (TESTS)
検査の中には、たとえば -newerXY や -samefile のように、現在検査の対象になっているファイルと、コマンドライ
ンで指定したリファレンスファイルとを比較することになっているものがある。 そうしたリファレンスファイルが実
際には何を指すかは、-H, -L, -P といったオプションや、先行する -follow の存在によって決まってくる。 ただ
し、リファレンスファイルが調べられるのは、一回だけであり、それはコマンドラインの解析が行われるときであ
る。 リファレンスファイルを調べることができない場合は (たとえば、それに対する stat(2) システムコールに失
敗するなど)、エラーメッセージが表示され、find は 0 以外のステータスで終了する。
数値の引き数は、以下の形で指定することができる。
+n n より大きい。
-n n より小さい。
n ちょうど n。
-amin n
ファイルの最終アクセス日時が n 分前であれば真を返す。
-anewer file
ファイルの最終アクセス日時が、file の内容更新日時よりも新しければ、真を返す。 引き数 file がシンボ
リックリンクで、しかも -H や -L オプションが有効になっている場合は、 リンク先のファイルの内容更新
日時が比較に使用されることになる。
-atime n
ファイルの最終アクセス日時が、基点となる時刻から計算して n 日前に当たれば、真を返す (訳注: 基点と
なる時刻は、デフォルトでは find を実行している今現在である)。 ファイルの最終アクセス日時が何日前か
を計算する際、時間差を 24 時間で割って出た小数点以下の端数は無視される。従って、-atime +1 にマッチ
するためには、ファイルは少なくとも二日前にアクセスされていなければならない。 (訳注: 1.5 日前は、1
日前と判定される。そして、-atime +1 は、2 日以上前である。 なお、デフォルトの動作のように、現在時
刻から数えて 24 時間前から 48 時間前までを 1 日前とするのではなく、今日の午前 0 時以前の 24 時間
(つまり、日常的な意味での昨日) を 1 日前として計算したいのなら、位置オプション -daystart を -atime
の前に置けばよい。)
-cmin n
ファイルの最終ステータス変更日時が n 分前ならば真。
-cnewer file
ファイルの最終ステータス変更日時が、file の内容更新日時よりも新しければ、真を返す。 引き数 file が
シンボリックリンクで、しかも -H や -L オプションが有効になっている場合は、 リンク先のファイルの内
容更新日時が比較に使用されることになる。
-ctime n
ファイルの最終ステータス変更日時が、基点となる時刻から計算して n 日前に当たれば、真を返す (訳注:
基点となる時刻は、デフォルトでは find を実行している今現在である)。 何日前かを計算する際、時間差を
24 時間で割った結果を丸めるせいで、 ファイルのステータス変更日時の解釈にどんな影響が出るかについて
は、 -atime の説明を参照していただきたい。 (訳注: 要するに、割り算の際に、小数点以下の端数を切り捨
てるということ。 なお、デフォルトの動作のように、現在時刻から数えて 24 時間前から 48 時間前までを
1 日前とするのではなく、今日の午前 0 時以前の 24 時間 (つまり、日常的な意味での昨日) を 1 日前とし
て計算したいのなら、位置オプション -daystart を -ctime の前に置けばよい。)
-empty ファイルが空で、通常のファイルかディレクトリならば真。
-executable
実行可能なファイルや (ファイル名解決の見地から見て) 検索可能なディレクトリにマッチする。 検査
-perm が ACL (アクセス・コントロール・リスト) などのパーミッション制御の仕組みを無視するのに対し
て、この検査は ACL なども考慮に入れる。この検査は access(2) システムコールを使用しているので、UID
マッピング (または root-squashing) を行っている NFS サーバがあると、正確な結果を得られないことがあ
る。なぜなら、たいていのシステムでは access(2) をクライアントのカーネルで実装しており、それ
故、サーバ側に保持されている UID マッピング情報を利用できないからだ。この検査はひとえに access(2)
システムコールの結果に基づいているので、 この検査が真を返したからと言って、そのファイルが実際に実
行できるとはかぎらない。
-false 常に偽を返す。
-fstype type
ファイルが置かれているファイルシステムが type ならば、真を返す。 有効なファイルシステムは、Unix の
系統によって様々である。 Unix の系統次第で指定可能なファイルシステムを不完全ながら挙げると、 ufs,
4.2, 4.3, nfs, tmp, mfs, S51K, S52K などがある。アクション -printf で書式指定子 %F を使えば、現在
使用中のファイルシステムのタイプが何かを知ることができる。
-gid n ファイルのグループ ID 番号が n ならば真。
-group gname
ファイルの属するグループが gname ならば真 (グループ ID 番号で指定してもよい)。
-ilname pattern
-lname と同じだが、大文字小文字を区別しない。-L や -follow オプションが有効な場合は、シンボリック
リンクがリンク切れしている場合を除き、この検査は偽を返す。
-iname pattern
-name と同じだが、大文字小文字を区別しない。 たとえば、パターン `fo*' や `F??' は、`Foo', `FOO',
`foo', `fOo' といったファイル名とマッチする。パターン `*foo*' は、`.foobar' というファイルともマッ
チすることになる。
-inum n
ファイルの inode 番号が n ならば真。 たいていの場合、この検査より、-samefile を使った方が簡単であ
る。
-ipath pattern
-path と同じだが、大文字小文字を区別しない。
-iregex pattern
-regex と同じだが、大文字小文字を区別しない。
-iwholename pattern
-ipath 参照。この別名は移植性で -ipath に劣る。
-links n
ファイルのハードリンク数が n ならば真。
-lname pattern
ファイルがシンボリックリンクであり、リンク先として指定されているパスがシェルのパターン pattern に
マッチすれば、真を返す。メタ文字は、`/' や `.' を例外扱いしない。 -L や -follow オプションが有効な
場合は、シンボリックリンクがリンク切れしている場合を除き、この検査は偽を返す。
-mmin n
ファイルの最終内容更新日時が n 分前であれば真。
-mtime n
ファイルの最終内容更新日時が、基点となる時刻から計算して n 日前に当たれば、真を返す (訳注: 基点と
なる時刻は、デフォルトでは find を実行している今現在である)。 何日前かを計算する際、時間差を 24 時
間で割った結果を丸めるせいで、 ファイルの内容更新日時の解釈にどんな影響が出るかについては、 -atime
の説明を参照していただきたい。 (訳注: 要するに、割り算の際に、小数点以下の端数を切り捨てるというこ
と。 なお、デフォルトの動作のように、現在時刻から数えて 24 時間前から 48 時間前までを 1 日前とする
のではなく、今日の午前 0 時以前の 24 時間 (つまり、日常的な意味での昨日) を 1 日前として計算したい
のなら、位置オプション -daystart を -mtime の前に置けばよい。)
-name pattern
ファイルやディレクトリのベースネーム (パスから最後の要素だけを残して、先行するディレクトリを取り
去ったもの) が、シェルのパターン pattern にマッチすれば、真を返す。検査 -name でマッチするかどうか
を調べられるファイル名は、先行するディレクトリを除去したものだから、スラッシュが含まれることはな
い。従って、`-name a/b' は何にもマッチしないことになる (-name ではなく、多分 -path を使う必要があ
るだろう)。そんなことをしようとすると、環境変数 POSIXLY_CORRECT が設定されていない場合は、警告メッ
セージが出る。メタ文字 (`*', `?', `[]') は、ベースネームの先頭にある `.' とマッチする
(findutils-4.2.2 からこのように変更になった。下記のセクション「規格への準拠」を参照)。 あるディレ
クトリとそれ以下にあるファイルをまとめて無視するには、-prune を使うとよい。 一例が -path の説明中
にある。波カッコ ('{}') は特殊文字として認識されない。 この点、bash を含む一部のシェルで、シェル・
パターン中の波カッコに特別な意味を付与しているのと異なっている。 ファイル名のマッチング
は、fnmatch(3) ライブラリ関数を用いて行われる。 パターンを引用符で囲むのを忘れないように。シェルに
よって展開されてしまわないようにするためである。
-newer file
ファイルが file よりも最近に内容を更新されていれば、真を返す。 引き数 file がシンボリックリンク
で、しかも -H や -L オプションが有効になっている場合は、リンク先のファイルの内容更新日時が比較に使
用されることになる。
-newerXY reference
検査対象ファイルのタイムスタンプの X 日時が、リフェレンスファイル reference のタイムスタンプの Y
日時より新しければ、真を返す。 X と Y の位置に来る文字は、以下のどの文字でもよい。
a ファイルのアクセス日時
B ファイルの作成日時
c inode のステータスが変更された日時
m ファイルの内容が更新された日時
t reference が日時の直接表現として解釈される
組み合わせによっては、無効なものもある。たとえば、X に t を指定しても無効である。 組み合わせの中に
は、すべてのシステムで実装されているとはかぎらないものもある。 たとえば、B はすべてのシステムでサ
ポートされているわけではない。 XY の無効な組み合わせやサポートされていない組み合わせを指定する
と、致命的エラーが生じる。 日時を直接指定すると、それは GNU date の -d オプションに対する引き数と
同じように解釈される。 リファレンスファイルの作成日時を使用しようとした場合に、作成日時が特定でき
ないと、致命的エラーのメッセージが出力される。 また、検査対象ファイルの作成日時を参照する検査を指
定した場合に、 作成日時がわからない環境では、その検査はいかなるファイルに対しても失敗することにな
る (訳注: この場合、失敗するというのは、検査が偽になることではなく、エラーになることのようだ。ご自
分の環境で確かめていただきたい)。
-nogroup
ファイルのグループ ID 番号に対応するグループが、システムに存在しない場合に、真を返す。
-nouser
ファイルのユーザ ID 番号に対応するユーザが、システムに存在しない場合に、真を返す。
-path pattern
ファイル名がシェルのパターン pattern にマッチすれば、真を返す。 メタ文字は、`/' や `.' を例外扱い
しない。従って、たとえば、
find . -path "./sr*sc"
は、`./src/misc' というディレクトリを (存在していれば) 表示することになる。 あるディレクトリ以下を
すべて無視するには、そこに存在するファイルを一つ一つ抑止するよりも、-prune を使用した方がよい。た
とえば、ディレクトリ `src/emacs' と、その下にあるファイルやディレクトリのすべてをスキップし、それ
以外のファイルが見つかったら、その名前を表示するとしよう。そのためには、こんな風にする。
find . -path ./src/emacs -prune -o -print
パターンマッチの検査は、パスを含むファイル名の全体に対して行われるが、 そうしたファイル名は、コマ
ンドラインで指定した探索開始点の一つから始まっていることに注意してしていただきたい。 だから、-path
の引き数に絶対パス名を使用することに意味があるのは、 関連する探索開始点がこちらも絶対パスであると
きだけだろう。 従って、次のコマンドは 何にもマッチしないことになる。
find bar -path /foo/bar/myfile -print
find は、-path の引き数を、目下検査してるファイルのディレクトリ名とベースネームを連結したものと比
較する。 その連結したものの末尾がスラッシュになることは絶対にないので、スラッシュで終わる -path の
引き数は、何にもマッチしないことになる (ただし、コマンドラインで指定された探索開始点となら、場合に
よってはマッチするかもしれないが)。 -path という述語は、HP-UX の find でもサポートされており、
POSIX 規格の次期バージョンでも採用されることになるだろう (訳注: 実際に POSIX 2008 で採用されてい
る)。
-perm mode
ファイルの許可属性が mode (8 進数表現でもシンボル表現でもよい) とまったく同じなら、真を返す。 mode
指定のこの形式では、許可属性がぴったり一致することを要求することになるので、 シンボルによる表現で
この形式を使おうとすると、かなり複雑なモード文字列を指定しなければならないかもしれない。 たとえば
`-perm g=w' は、許可属性が 0020 のファイルにしかマッチしない (すなわち、許可属性のうち、グループの
書き込み許可のみが立っているファイルだ)。 従って、mode の前に `/' や `-' を付ける形式を使いたくな
ることの方が、多分多いだろう。 たとえば、`-perm -g=w' とすれば、グループの書き込み許可があるファイ
ルなら、どんなファイルにもマッチすることになる。 具体例については「用例」セクションをご覧いただき
たい。
-perm -mode
mode で指定した許可属性ビットのすべてが、ファイルでも立っていれば、真を返す。 mode 指定のこの形式
でも、シンボルによる許可属性表現が使用できる。 そこで、この形式ではシンボルによる表現を使いたくな
ることが多いだろう。 シンボルによる表現を使用する場合は、`u' や `g' や `o' を きちんと指定しなけれ
ばならない。 具体例については「用例」セクションをご覧いただきたい。
-perm /mode
mode で指定した許可属性ビットのどれかが、ファイルでも立っていれば、真を返す。 mode 指定のこの形式
でも、シンボルによる許可属性表現が使用できる。 シンボルによる表現を使用する場合は、`u' や `g' や
`o' をきちんと指定しなければならない。 具体例については「用例」セクションをご覧いただきたい。な
お、mode で許可属性ビットが一つも立っていない場合、この検査はいかなるファイルにもマッチすることに
なる (これは、-perm -000 と動作に一貫性を持たせるための変更である。 (訳注: -perm -mode と -perm
/mode のどちらの指定法においても、0 は何であってもよいを意味するようにしたということ))。
-perm +mode
この形式は、今ではサポートされていない (2005 年以来、非推奨だった)。 代わりに -perm /mode を使用
すること。
-readable
読み込み可能なファイルにマッチする。検査 -perm が ACL (アクセス・コントロール・リスト) などのパー
ミッション制御の仕組みを無視するのに対して、この検査は ACL なども考慮に入れる。 この検査は
access(2) システムコールを使用しているので、UID マッピング (または root-squashing) を行っている
NFS サーバがあると、正確な結果を得られないことがある。なぜなら、たいていのシステムでは access(2)
をクライアントのカーネルで実装しており、それ故、サーバ側に保持されている UID マッピング情報を利用
できないからである。
-regex pattern
ファイル名が正規表現 pattern にマッチすれば、真を返す。 これはパスを含むファイル名全体に対するマッ
チであって、ベースネームの検索ではない。 だから、たとえば、`./fubar3' という名前のファイルにマッチ
させるために、 正規表現 `.*bar.' や `.*b.*3' は使用できるが、`f.*r3' は使用できない。 find が理解
する正規表現は、デフォルトでは Emacs の正規表現だが、 これは -regextype オプションで変更することが
できる。
-samefile name
ファイルが name と同じ inode を参照していれば、真を返す。 -L が有効な場合、シンボリックリンクも真
を返す。
-size n[cwbkMG]
ファイルが n 単位分の領域を使用していれば、真を返す (対象となるファイルのサイズを、単位にまで切り
上げて比較する)。以下の接尾辞が使える。
[訳注]: ブロック数を指定するときは、注意していただきたい。 -size では、検査対象ファイルのブロック
数の算出を、単にファイルのサイズを 512 で割り、その結果を切り上げて整数にすることで行って
いる。 これは、stat コマンドの出力や POSIXLY_CORRECT が設定されているときの ls -s の結果
と、同じではないことが多い。stat や ls は、ファイルに対するディスクスペースの割当が、ファ
イルシステムのブロックサイズ (ext4 なら、たいてい 4096 バイト、つまり 8 ブロック) の倍数で
行われることを考慮に入れているのである。なお、アクション -printf における `%b' の出力
は、stat などと同じである。
`b' 単位はブロック。1 ブロックは 512 バイト。(これが接尾辞を使わないときの デフォルトである)
`c' 単位はバイト。
`w' 単位はワード。1 ワードは 2 バイト。
`k 単位はキビバイト (1 キビバイトは 1024 バイト)。
`M' 単位はメビバイト (1 メビバイトは 1048576 バイト)。
`G' 単位はギビバイト (1 ギビバイトは 1073741824 バイト)。
サイズには間接ブロック (indirect block) の分は含まれないが、穴空きファイル (sparse file) におけ
る、実際には割り当てられていないブロックの分は含まれる。 アクション -printf の `%k' や `%b' 書式指
定子とは、穴空きファイルの扱い方が違うことを心にとめておいていただきたい。 また、接尾辞 `b' は常に
512 バイトのブロックを意味し、1 キロバイトのブロックを指すことはない。 その点で、アクション -ls の
動作とは異なっている。 数値の前に + や - を付けると、他の場合と同様、「より大きい」や「より小さ
い」を意味することになるが、 ファイルのサイズは、単位以下の部分が、単位にまで切り上げられることに
留意していただきたい (だから、1 byte のファイルは、-size -1M にマッチしない。(訳注: -size 1M とな
らマッチする))。
-true 常に真。
-type c
ファイルのタイプが c であれば真。(訳注: c の位置には実際には以下の文字が来る。)
b ブロック・スペシャルファイル (バッファあり)
c キャラクタ・スペシャルファイル (バッファなし)
d ディレクトリ
p 名前付きパイプ (FIFO)
f 通常のファイル
l シンボリックリンク。オプション -L や -follow が有効な場合、 シンボリックリンクがリンク切れ
の場合を除いて、この検査が真になることはない。 -L が有効なときにシンボリックリンクを検索し
たかったら、-xtype を使うべきである。
s ソケット
D ドア (Solaris の場合)
-uid n ファイル所有者のユーザ ID 番号が n ならば真。
-used n
ファイルが最後にアクセスされたのが、ファイルの最終ステータス変更日時より n 日後ならば、真を返す。
-user uname
ファイルの所有者が uname というユーザならば真 (ユーザ ID 番号で指定してもよい)。
-wholename pattern
-path と同じである。この別名は移植性で -path に劣る。
-writable
書き込み可能なファイルにマッチする。検査 -perm が ACL (アクセス・コントロール・リスト) などのパー
ミッション制御の仕組みを無視するのに対して、 この検査は ACL なども考慮に入れる。この検査は
access(2) システムコールを使用しているので、UID マッピング (または root-squashing) を行っている
NFS サーバがあると、正確な結果を得られないことがある。なぜなら、たいていのシステムでは access(2)
をクライアントのカーネルで実装しており、それ故、サーバ側に保持されている UID マッピング情報を利用
できないからである。
-xtype c
検査の対象となるファイルがシンボリックリンクでないかぎり、-type と同じである。 ファイルがシンボ
リックリンクのときは、以下のように動作する。 -H や -P オプションが指定された場合は、タイプが c の
ファイルに対するリンクならば、真を返す。また、-L オプションが指定されている場合は、c が `l' なら
ば、真を返す。 言い換えると、ファイルがシンボリックであるとき、-xtype は、-type がチェックしない方
のファイルのタイプをチェックするわけだ。
-context pattern
(SELinux が有効なときのみ) ファイルのセキュリティ・コンテキストが glob のパターン (訳注: つま
り、シェル式のパターン) pattern にマッチすれば、真を返す。
アクション
-delete
ファイルを消去する。消去に成功すれば、真を返す。 消去に失敗した場合は、エラーメッセージを表示す
る。 -delete に失敗した場合の find の終了ステータスは、ゼロ以外である (find が最終的に終了したとき
の終了ステータスのことだ)。-delete を使用すると、自動的に `-depth' オプションが有効になる。
警告: 忘れないでいただきたいが、find のコマンドラインは一つの式 (expression) として評価されるの
で、一番最初に -delete を指定すると、 find は、指定された探索の開始点以下にあるものを、ことごとく
消去しようとする。 後で -delete を付けて使用するつもりで、find のコマンドラインをテスト実行すると
きは、-depth を明示的に指定するとよい。 そうすれば、後で「こんなはずではなかった」と慌てないです
む。 -delete を指定すると自動的に -depth が有効になるので、-prune を -delete と一緒に使っても役に
立たない。
-exec command ;
command を実行する。command の返り値が 0 ならば、真を返す。 find のコマンドラインで指定されている
これ以降の引き数は、`;' という引き数が現れるまで、すべてコマンドに対する引き数と見なされる。 文字
列 `{}' は、それがコマンドの引き数中に現れるすべての場所で、現在処理中のファイル名に置き換えられ
る。 find の一部の版とは違い、`{}' は引き数中の一ヶ所でしか使えないわけではない。 こうした構文の要
素 (訳注: すなわち、`{}' や `;') は、シェルによって展開されないように、 どちらも `\' でエスケープ
するなり、引用符で囲むなりする必要があるかもしれない。 アクション -exec の使用例については「用
例」セクションを見ていただきたい。 指定したコマンドは、マッチした各ファイルに対して一回づつ実行さ
れる。 また、コマンドは find を実行したディレクトリで実行される。 そこで、-exec アクションの使用を
巡っては、セキュリティの問題が避けられないわけであり、 -exec の代わりに、-execdir アクションを使用
することをお勧めする。 (訳注: `;' は引き数なので、直前の引き数との間に空白が必要だということに注意
していただきたい。)
-exec command {} +
アクション -exec のこの変形も、選択したファイルに対して指定したコマンドを実行するが、 コマンドライ
ンを形成するとき、選択した各ファイル名をコマンドラインの末尾に追加して行くという方法を取る (訳注:
コマンドラインが長くなりすぎるときは、処理するファイル名のリストを適宜分割して、コマンドを複数回実
行する)。 そのため、コマンドを呼び出す回数が、マッチしたファイルの数よりずっと少なくてすむ。 コマ
ンドラインの形成法は、 xargs のコマンドライン形成法とほぼ同じである。 `{}' はコマンドライン中の一
ヶ所でしか使えない。 なお、コマンドは find を実行したディレクトリで実行される。 find がエラーに出
会うと、このアクションは find をその場で終了させてしまうことがあり、 そのため、予定されているコマ
ンドの中に全く実行されないものが生ずるかもしれない。 -exec のこの変形は、常に真を返す。 (訳注: `+'
は引き数なので、直前の引き数との間に空白が必要だということに注意していただきたい。)
-execdir command ;
-execdir command {} +
-exec と似ているが、指定したコマンドを、マッチしたファイルが存在するサブディレクトリで実行するとい
う点が異なっている。 そのサブディレクトリは、 find を実行したディレクトリとは違うのが普通だ。 これ
はコマンドを呼び出す方法としてずっと安全である。マッチしたファイルのパスを解決する際に、競合状態が
起きるのを避けられるからだ。 アクション -exec の場合と同様、 -execdir の `+' を伴う形式でも、 マッ
チした複数のファイルを一度に処理するように、コマンドラインを形成することになるが、 command のどの
呼び出しにおいても、処理の対象としてリストされるファイルは、同じサブディレクトリに存在するものだけ
である。 このアクションを使用するのなら、環境変数 $PATH が `.' を参照しないようにしなければならな
い。 さもないと、悪意を持った攻撃者が、あなたが -execdir を実行することになるディレクトリに適当な
名前のファイルを入れておくことによって、 何でも好きなコマンドを実行できてしまうからだ。 $PATH の中
に、空っぽのエントリや、絶対パスのディレクトリ名ではないエントリがある場合にも、同じことが言える。
find がエラーに出会うと、このアクションは find をその場で終了させてしまうことがあり、 そのため、予
定されているコマンドの中に全く実行されないものが生ずるかもしれない。 このアクションが返す値は、+
と ; のどちらを使うかによって異なっている。 -execdir command {} + が常に真を返すのに対し
て、-execdir command {} ; は、command が 0 を返したときのみ、真を返すのである。
-fls file
真を返す。-ls と似ているが、-fprint 同様、出力を file に書き出す点が違う。 出力用のファイルは、こ
の述語の対象になるものが一つもなかった場合でも、必ず作成される。 ファイル名中の普通使わない文字が
どのように扱われるかについては、「変わり者のファイル名」セクションを参照していただきたい。
-fprint file
真を返す。パス付きのファイル名をファイル file に出力する。 find の実行時に file が存在しなけれ
ば、新たに作成される。 すでに存在していれば、元の中身が捨てられる。ファイル名 `/dev/stdout' と
`/dev/stderr' の扱いは特別で、それぞれ標準出力と標準エラー出力を指している。 出力用のファイル
は、この述語の対象になるものが一つもなかった場合でも、必ず作成される。 ファイル名中の普通使わない
文字がどのように扱われるかについては、「変わり者のファイル名」セクションを参照していただきたい。
-fprint0 file
真を返す。-print0 と似ているが、-fprint 同様、出力を file に書き出す点が違う。 出力用のファイル
は、この述語の対象になるものが一つもなかった場合でも、必ず作成される。 ファイル名中の普通使わない
文字がどのように扱われるかについては、「変わり者のファイル名」セクションを参照していただきたい。
-fprintf file format
真を返す。-printf と似ているが、 -fprint 同様、出力を file に書き出す点が違う。 出力用のファイル
は、この述語の対象になるものが一つもなかった場合でも、必ず作成される。 ファイル名中の普通使わない
文字がどのように扱われるかについては、「変わり者のファイル名」セクションを参照していただきたい。
-ls 真を返す。処理対象のファイルを ls -dils の書式で標準出力にリストする。 ブロック数は、1 ブロック 1
キロバイトの計算である。 ただし、環境変数 POSIXLY_CORRECT が設定されている場合は、1 ブロック 512
バイトが使用される。 ファイル名中の普通使わない文字がどのように扱われるかについては、「変わり者の
ファイル名」セクションを参照していただきたい。
-ok command ;
-exec と似ているが、まずユーザに問い合わせを行う。 ユーザーが同意すれば、コマンドを実行する。同意
しなければ、何もせずに偽を返す。 コマンドを実行する場合、そのコマンドの標準入力は、/dev/null に付
け換えられる。
プロンプトに対するユーザの応答は、肯定・否定を表す一組の正規表現と照合して、同意か、不同意かが判断
される。 この正規表現は、環境変数 `POSIXLY_CORRECT' が設定されていれば、システムから得られるが、
設定されていなければ、find の持つメッセージ翻訳から取得される。 なお、システムに適切な定義が存在し
ない場合は、 find の持つ定義が使用されることになる。 どちらの場合でも、正規表現そのものの解釈
は、環境変数 'LC_CTYPE' (文字クラスについて) や 'LC_COLLATE' (文字の範囲や等価クラスについて) の影
響を受ける。
-okdir command ;
-execdir と似ているが、-ok と同じように、まずユーザに問い合わせを行う。 ユーザが同意しなければ、何
もせずに偽を返す。 コマンドを実行する場合、そのコマンドの標準入力は、/dev/null に付け換えられる。
-print 真を返す。パス付きのファイル名を標準出力に表示し、各ファイル名の後ろに改行文字を付ける。 find の出
力をパイプを使って他のプログラムに渡している場合、 検索対象のファイル名に改行文字が含まれている可
能性が、わずかにでもあるならば、 -print ではなく、 -print0 アクションを使用することを真剣に考える
べきだ。 ファイル名中の普通使わない文字がどのように扱われるかについては、「変わり者のファイル
名」セクションを参照していただきたい。
-print0
真を返す。パス付きのファイル名を標準出力に表示し、各ファイル名の後ろに (-print が改行文字を付ける
のとは違って) ヌル文字を追加する。 このアクションを使えば、find の出力を処理するプログラムが、改行
文字などのホワイトスペースを含むファイル名を正しく解釈できるようになる。 このアクションは、xargs
の -0 オプションに呼応している。
-printf format
真を返す。標準出力に format を表示する。そのとき format 中の `\' によるエスケープシーケンスと、`%'
に始まる書式指定子を認識して変換する。 フィールドの幅や精度は、C 言語の `printf' 関数と同じ方法で
指定できる。 %d ではなく、%s として (訳注: すなわち、数値ではなく、文字列として) 表示されるフィー
ルドが多いことに注意していただきたい。 そのため、フラグが期待通りに効かないかもしれないのだ。 ただ
し、`-' フラグ (フィールドを強制的に左揃えにする) はきちんと働くということでもある。-print とは
違って、 -printf は文字列の末尾に改行文字を追加しない。 バックスラッシュ・エスケープシーケンスと書
式指定子は以下のとおりである。
\a 警告ベル。
\b バックスペース。
\c このフォーマットによる出力をただちに停止し、出力をフラッシュする。
\f フォームフィード文字。
\n 改行文字。
\r 復帰文字。
\t 水平タブ。
\v 垂直タブ。
\0 ASCII NUL 文字。
\\ バックスラッシュ文字そのもの (`\')。
\NNN ASCII コードが NNN (8 進数) の文字。
バックスラッシュ文字 `\' に上記以外の文字が続く場合、`\' は普通の文字として扱われる。 従って、二文
字とも表示されることになる。
%% パーセント文字そのもの。
%a ファイルの最終アクセス日時を C 言語の `ctime' 関数が返す形式で表示する。
%Ak ファイルの最終アクセス日時を k で指定した書式で表示する。k には `@' か、あるいは C 言語の
`strftime' 関数の書式指定子を用いる。 k に指定可能な値を以下に列挙する。 一部のものは使えな
いシステムがあるかもしれないが、それはシステム間での `strftime' の非互換性による。
@ Jan. 1, 1970, 00:00 GMT からの経過秒数。小数点以下も表示する。
時刻フィールド:
H 時 (00..23)
I 時 (01..12)
k 時 ( 0..23)
l 時 ( 1..12)
M 分 (00..59)
p 現在のロケールにおける AM/PM の相当語
r 12 時間制の時刻 (hh:mm:ss [AP]M)
S 秒 (00.00 .. 61.00)。小数点以下も表示。
T 24 時間制の時刻 (hh:mm:ss)
+ 日付と時刻。両者の間は `2004-04-28+22:22:05.0' といった具合に '+' で 区切られる。 こ
れは GNU の拡張である。日時は現在のタイムゾーンのものが使われる (それ故、環境変数 TZ
の設定によって変わるかもしれない)。秒には小数点以下も付く。
X 現在のロケールによる時刻表示 (H:M:S)
Z タイムゾーン (JST など)。タイムゾーンを決定できない場合は、何も表示しない。
日付フィールド:
a 現在のロケールによる曜日の短縮形 (Sun..Sat)
A 現在のロケールによる曜日の省略しない表示。長さは可変 (Sunday..Saturday)
b 現在のロケールによる月名の短縮形 (Jan..Dec)
B 現在のロケールによる月名の省略しない表示。長さは可変 (January..December)
c 現在のロケールによる日付と時刻の表示 (Sat Nov 04 12:02:33 EST 1989)。 この表示形式は
ctime(3) のものと同じであり、ctime(3) の形式との互換性を維持するためにそうなってい
る。秒には小数点以下が付かない。
d その月の何日目かの表示 (01..31)
D 日付 (mm/dd/yy)
h b と同じ
j その年の何日目かの表示 (001..366)
m 月 (01..12)
U その年の何週目か (日曜日を週の始まりとする) (00..53)
w 曜日 (0..6)
W その年の何週目か (月曜日を週の始まりとする) (00..53)
x 現在のロケールによる日付表示 (mm/dd/yy)
y 年の下二桁 (00..99)
Y 年 (1970...)
%b ファイルのディスクスペース使用量を 1 ブロック 512 バイトのブロック数で表示する。 ディスクス
ペースは、ファイルシステムのブロックサイズの倍数で割り当てられるので、この表示はたいてい
%s/512 より大きい。だが、ファイルが穴空きファイル (sparse file) の場合は、%s/512 より小さく
なることもある。
%c ファイルの最終ステータス変更日時を C 言語の `ctime' 関数が返す形式で表示する。
%Ck ファイルの最終ステータス変更日時を k で指定した書式で表示する。 k は %A の場合と同じであ
る。
%d ファイルがディレクトリツリー中でどの深さにあるかを示す。 0 だったら、そのファイルが探索開始
点だということだ。
%D ファイルがどのデバイス上にあるかを十進数のデバイス番号で示す (stat 構造体の st_dev フィール
ドに当たる)。
%f 先行するディレクトリをすべて取り去ったファイル名 (すなわち、最後の要素のみ表示)。
%F ファイルが置かれているファイルシステムのタイプ。ここで表示された値は -fstype の引き数に指定
することができる。
%g ファイルのグループ名。該当するグループ名が存在しない場合は、グループ ID 番号。
%G ファイルのグループ ID 番号。
%h ファイル名中の先行するディレクトリの部分 (すなわち、最後の要素以外のすべて)。 ファイル名に
スラッシュが一つも含まれない場合は (それは、カレントディレクトリ中にあるということだか
ら)、%h 書式指定子は "." に展開される。
%H 探索開始点のうち、その下に問題のファイルが見つかったもの。
%i ファイルの inode 番号 (十進数表示)。
%k ファイルのディスクスペース使用量を 1 ブロック 1 キロバイトのブロック数で表示する。 ディスク
スペースは、ファイルシステムのブロックサイズの倍数で割り当てられるので、この表示はたいてい
%s/1024 より大きい。 だが、ファイルが穴空きファイル (sparse file) の場合は、%s/1024 より小
さくなることもある。
%l シンボリックリンクの参照先 (ファイルがシンボリックリンクでなかったら、空文字列)。
%m ファイルの許可属性ビット (8 進数表示)。このオプションが使用している数値は、 Unix のたいてい
の実装が使用している「伝統的な」数値である。 しかし、ご使用のシステムの実装では、8 進数で表
示する許可属性ビットの並び方が独特かもしれない。 その場合は、ファイルの許可属性の実際の値と
%m の出力とが、相違することになる。 この数値の先頭に 0 を付けて表示したいこともよくあるが、
そのためには、# フラグを使用すればよい (たとえば、`%#m' といった具合に)。
%M ファイルの許可属性 (ls と同様のシンボルによる表現)。この書式指定子は findutils 4.2.5 以来
サポートされている。
%n ファイルのハードリンク数。
%p ファイル名。
%P 問題のファイルが、ある探索開始点の下にあった場合に、 ファイル名から探索開始点を示す部分を取
り去ったもの。
%s バイトで表示したファイルサイズ。
%S ファイルの穴空き率 (sparseness)。この値は、(BLOCKSIZE*st_blocks / st_size) で計算される。あ
る大きさの普通のファイルから得られる値は、厳密に言うと、システム依存である。 それでも、穴空
きファイルの穴空き率は、通常 1.0 未満になるし、 間接ブロックを使用しているファイルの穴空き
率は、1.0 以上になることがある。 BLOCKSIZE に使われる値は、システム次第だが、普通は 512 バ
イトである。 ファイルサイズが 0 の場合、出力される値は不定である。 st_blocks をサポートして
いないシステムでは、ファイルの穴空き率は、1.0 と見なされる。
%t ファイルの最終内容更新日時を、C 言語の `ctime' 関数が返す形式で表示する。
%Tk ファイルの最終内容更新日時を k で指定した書式で表示する。 k は %A の場合と同じである。
%u ファイルの所有者名。該当するユーザ名が存在しない場合は、ユーザ ID 番号。
%U ファイルのユーザ ID 番号。
%y ファイルのタイプ (ls -l の表現とほぼ同じ)。U=unknown type (これが表示されることはないはず
だ)
%Y ファイルのタイプ (表示は %y と同じ)。ただし、シンボリックリンクをたどる。 その場合、L=loop,
N=nonexistent である。
%Z (SELinux が有効なときのみ) ファイルのセキュリティ・コンテクスト。
%{ %[ %(
将来の使用のために予約されている。
一個の `%' に上記以外の文字が続く場合、`%' 文字は捨てられるが、それに続く文字は表示される (書式指
定文字が新たに追加されるかもしれないので、この動作を当てにしてはいけない。 (訳注: 以前はそのとおり
だったが、現在では、無効な書式指定子を使った場合、`%q' のように `%' も表示されるようだ))。 書式指
定の末尾に `%' があるときの動作は、続く文字がないので不定である。 ロケールによっては、お宅のドアの
鍵が見つからなくなるかもしれない。 また、別のロケールでは、お読みになっている小説の最後のページが
消えてしまうかもしれない。
書式指定子 %m と %d はフラグ #, 0, + をサポートするが、 それ以外の書式指定子では、数値を表示する場
合でも、そうしたフラグをサポートしない。 # などをサポートしない数値関係の書式指定子には、G, U, b,
D, k, n などがある。しかし、書式フラグ `-' はサポートされており、フィールドを (デフォルトの) 右揃
えから左揃えに変更する。
ファイル名中の普通使わない文字がどのように扱われるかについては、 「変わり者のファイル名」セクショ
ンの説明を参照していただきたい。
-prune 真を返す。処理対象のファイルがディレクトリの場合は、そのディレクトリ以下に降りて行かない。 -depth
が指定してあると、-prune は、 偽を返し、その効果を失う。-delete を指定すると自動的に -depth が有効
になるので、-prune を -delete と一緒に使っても役に立たない。
[訳注]: つまり、-prune は指定されたディレクトリの、いわゆる枝刈り (prune) をする。バージョン
4.3.11 以降の find では、-prune の動作が、上の説明と少し違っている。-depth が指定してある
と、-prune が効果を失う (すなわち、枝刈りを行わなくなる) ことは、それ以前と変わりがない
が、返り値は真を返すようになっているのだ。 これは POSIX 準拠の動作である。ご自分で、 find
. -depth -path "./foo" -prune -print などを実行して、確認していただきたい。-prune が真を返
していれば、ディレクトリ ./foo が表示されるはずである。
-quit 直ちに終了する。動いている子プロセスを残したまま終了したりはしないが、コマンドラインで指定したパス
をこれ以上処理することはない。 たとえば、 find /tmp/foo /tmp/bar -print -quit は、/tmp/foo を表示
するだけである。 -execdir ... {} + によってすでに作成されたコマンドラインがあれば、 find が終了す
る前に、呼び出して実行する。 終了ステータスは、 エラーがすでに起きているかどうかよって、0 のこと
も、0 でないこともある。
演算子
演算子を優先順位の高いものから順に列挙する。
( expr )
カッコの内側を先に処理する。カッコはシェルにとって特別な意味を持っているので、普通はクォートする必
要があるだろう。 このマニュアルページで挙げている例の多くでは、そのためにバックスラッシュを使って
いる。 すなわち `(...)' ではなく、`\(...\)' と書いている。
! expr expr が偽の場合、真になる。 通常、この記号もシェルによって解釈されないようにする必要があるだろう。
-not expr
! expr と同じだが、POSIX 準拠の表現ではない。
expr1 expr2
連続する二つの式は、and 結合と解釈される (明示されていないが、式の間に "-a" があると見なされるわけ
だ)。expr1 が偽の場合、expr2 は評価されない。
expr1 -a expr2
expr1 expr2 と同じ。
expr1 -and expr2
expr1 expr2 と同じだが、POSIX 準拠の表現ではない。
expr1 -o expr2
or 結合である。expr1 が真ならば、expr2 は評価されない。
expr1 -or expr2
expr1 -o expr2 と同じだが、POSIX 準拠の表現ではない。
expr1 , expr2
リストである。常に expr1 と expr2 の両方が評価される。 expr1 の値は捨てられ、expr2 の値がリスト全
体の値になる。 コンマ演算子はいくつかの異なったタイプの対象を捜すとき便利だが、ファイルシステム階
層の探索は一度しか行われない。 異なった形でマッチした対象の一覧をそれぞれ別の出力ファイルに書き出
すには、-fprintf アクションを利用すればよい。
[訳注]: find にとって演算子も引き数である。だから `(', `)', `!', `,' といった演算子も、 前後の引き数との
間に空白が必要だということに気をつけていただきたい。
変わり者のファイル名
多くの場合 find のアクションは、他のユーザが自由にできるデータを端末に表示することになる。 そうしたデータ
には、 たとえば、ファイルの名前、サイズ、内容更新日時などがある。 この内、ファイル名は `\0' と `/' 以外の
どんな文字でも使えることになっているので、時として問題の種となる。 ファイル名の中に普通は使わない文字があ
ると、使用している端末に思いがけない、そしてしばしば望ましくない影響をもたらすことがあるのだ (たとえば、
端末によっては、ファンクション・キーの現在の設定が変更されてしまう)。 普通使わない文字をどう扱うかはアク
ションによって異なっている。それを以下に示そう。
-print0, -fprint0
常にファイル名に手を加えず、そのまま出力する。出力先が端末であっても、同じである。
-ls, -fls
普通使わない文字は、常にエスケープされる。ホワイトスペース (空白、改行、タブなど)、バックスラッ
シュ、ダブルクォートは C 言語式のエスケープ表現で出力される (たとえば `\f', `\"')。他の普通使わな
い文字には、エスケープした 8 進数が使われる。 それ以外の表示可能な文字は (-ls や -fls とっては 8
進数の 041 から 0176 に当たる文字)、手を加えずにそのまま出力される。
-printf, -fprintf
出力先が端末でない場合は、そのまま出力される。端末の場合は、使用される書式指定子によって、結果は
様々である。 書式指定子 %D, %F, %g, %G, %H, %Y, %y が展開される値は、ファイルの所有者の管轄外なの
で、そのまま出力される。 書式指定子 %a, %b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u, %U の値
は、ファイル所有者の管轄内ではあるが、それを使って端末に勝手なデータを送ることはできない。 従っ
て、そのまま出力される。書式指定子 %f, %h, %l, %p, %P はクォートされる。 このクォート方法は、GNU
ls と同じである (訳注: 厳密に言うと、現在のところ ls -N と同じ。ls はバージョンによっては、デフォ
ルトの表示が -N ではないことがある)。つまり、-ls や -fls におけるクォート方法とは違うということ
だ。もし、find の出力に使用する形式を自由に決めることができるならば、たいていの場合、 終端文字に改
行ではなく、`\0' を使用した方がよい。 ファイル名には空白や改行が含まれていることがあるからだ。 ど
の文字にクォートが必要かを判断するには、環境変数 `LC_CTYPE' の設定が使用される。
-print, -fprint
クォートは -printf や -fprintf と同じやり方で行われる。 find をスクリプト中で使っている場合
や、マッチするファイルが我儘なファイル名を持っているかもしれない場合は、-print ではなく、 -print0
の使用を考えた方がよいだろう。
アクション -ok と -okdir は、対象となるファイル名をそのまま手を加えずに出力する。 この動作は、将来のリ
リースで変わるかもしれない。
規格への準拠
POSIX 規格にできるだけ準拠した動作を求めるのなら、環境変数 POSIXLY_CORRECT を設定するとよい。以下のオプ
ションや述語は POSIX 規格 (IEEE Std 1003.1, 2003 Edition) で規定されている。
-H このオプションはサポートしている。
-L このオプションはサポートしている。
-name この述語はサポートしている。しかし、POSIX への準拠度は、システムの fnmatch(3) ライブラリ関数がどの
程度 POSIX に準拠しているかに依存している。 findutils-4.2.2 以来、シェルのメタ文字 (`*', `?', `[]'
など) は、 ファイル名の先頭の `.' 文字にマッチするが、これは IEEE PASC interpretation 126 がそう要
求しているからである。この動作は それ以前のバージョンの findutils と異なっている。
-type サポートしている。POSIX では `b', `c', `d', `l', `p', `f', `s' を規定している。GNU find は、そのほ
か「ドア」を表す `D' もサポートしているが、 使えるのは OS がそうしたファイル・タイプを用意している
場合のみである。
-ok サポートしている。プロンプトに対する応答は、"yes"、"no" を表すパターンに照らして解釈されるが、その
パターンは、環境変数 `LC_MESSAGES' を設定することによって選択される。環境変数 `POSIXLY_CORRECT' が
設定されている場合は、何が肯定的応答 (yes) で、何が否定的応答 (no) かを決めているシステムの定義
が、このパターンとして使用される。 nl_langinfo(3) に関するシステムの文書、特に YESEXPR と NOEXPR
の部分を参照してほしい。それに対し、`POSIXLY_CORRECT' が設定されていない場合は、 パターンは、シス
テムではなく、find の持つメッセージ・カタログから取得されるのである。
-newer サポートしている。指定されたファイルがシンボリックリンクの場合は、必ずリンク先が参照される (訳注:
訳者としては、「-L や -H オプションが有効な場合は」という条件が必要ではないかと思う。 -P, -L, -H
オプションや、検査 -newer の説明を参照)。 以前のバージョンでは、シンボリックリンクそのものから比較
に使う日時を取得していたが、 動作がこのように変更になった。後述の「履歴」セクションも参照してほし
い。
-perm サポートしている。環境変数 POSIXLY_CORRECT が設定されていない場合は、POSIX では無効な (たとえ
ば、+a+x といった) モード指定の引き数も、後方互換のために使用できるようになっている (訳注: find
4.6.0 では、POSIXLY_CORRECT が設定されていないときでも、+a+x のような -perm +mode の形式は使えなく
なっている)。
その他の述語
-atime, -ctime, -depth, -group, -links, -mtime, -nogroup, -nouser, -perm, -print, -prune, -size,
-user -xdev といった述語は、すべてサポートしている。
POSIX 規格は、カッコ `(', `)'、否定 `!'、それに and と or 演算子 (-a, -o) を規定している。
上記以外のすべてのオプション、述語、式などは、POSIX 規格にない拡張である。 とは言え、そうした拡張の多く
は、GNU find に特有なものではない。
POSIX 規格によれば、 find はループを検出することになっている。
find ユーティリティは無限ループを検出しなければならない。 無限ループとは、探索中に入ったディレクト
リが、すでに訪れたことがあり、しかも直前に処理対象にしたファイルの上位にあるディレクトリであること
である。 無限ループを検出した場合、find は何が起きたかを告げる診断メッセージを標準エラーに表示
し、探索位置をディレクトリ階層上の元の位置に戻すか、終了すべきである。
GNU find はそうした要求に従っている。 ディレクトリがその中に上位ディレクトリへのハードリンクであるエント
リを含んでいる場合は、 ディレクトリのハードリンク数が、そのエントリが普通のサブディレクトリならそうなるは
ずの数よりも、たいてい少なくなるものだ (訳注: 実際には、Linux を始め、ディレクトリのハードリンクを禁止し
ているシステムが多い)。その結果、 GNU find が時として、実際には上位ディレクトリへのハードリンクであるサブ
ディレクトリを、最適化の副作用で探索しないことが起こりえる。その場合、 find は確かにそうしたディレクトリ
に足を踏み入れないわけだから、「ループ検出」の診断メッセージを出さないでもよいことになっている。 これはか
なり紛らわしい動作かもしれないが、find のこの動作を本気で当てにしている人もいないことだろう。 -noleaf オ
プションを指定して、ディレクトリ・ツリー上の葉っぱを簡易判別する最適化を無効にしている場合は (訳注:
-noleaf 参照)、こうしたディレクトリ・エントリに対する検査も省略されずに行われ、 必要ならば、診断メッセー
ジが表示されることになる。シンボリックリンクを使っていれば、 ファイルシステム上に本物の循環を起こすことは
ないが、それでも、-L や -follow を使用している場合は、探索中にシンボリックリンクのループに出会えば、診断
メッセージが表示される。 ハードリンクを含むループの場合と同様、葉っぱを簡易判別する最適化を使用している
と、 find はたいていの場合、シンボリックリンクに対して stat() や chdir() を呼び出すまでもないと知っている
ことになるので、ループの診断は不要になることが多い。
-d オプションは BSD システム各種との互換性のためにサポートされている。 だが、POSIX に準拠している -depth
オプションの方を使った方がよい。
環境変数 POSIXLY_CORRECT は、検査 -regex や -iregex の動作に影響を与えない。 そうした検査は、POSIX 規格で
規定されていないからである。
環境変数
LANG 国際化関係の環境変数のうち、値が設定されていなかったり、null だったりする変数に対して、LANG の値が
デフォルトの値になる。
LC_ALL この環境変数が空文字列以外の値に設定されていると、その値が国際化関係の他のすべての環境変数の値より
も優先される。
LC_COLLATE
POSIX の規定によれば、この環境変数は検査 -name で使われるパターンマッチングに影響する。 GNU find
は fnmatch(3) ライブラリ関数を使用しているので、LC_COLLATE への対応はシステムのライブラリ次第であ
る。また、この変数はアクション -ok に対する応答の解釈にも影響を及ぼす。 -ok に対する応答の解釈に使
用される実際のパターンは LC_MESSAGES 変数によって選択されるのだが、そのパターン中に角カッコ式が使
われている場合の解釈は、LC_COLLATE の影響を受けるのである。
LC_CTYPE
この環境変数は、正規表現で使用される文字クラスの処理に影響する。 システムの fnmatch(3) ライブラリ
関数が対応している場合は、検査 -name で使われる文字クラスの処理にも影響を及ぼす。また、この変数
は、アクション -ok が出すプロンプトに対してユーザが応答する際、諾否の判断に使用される正規表現に文
字クラスが使われていれば、 その解釈にも影響する。さらにまた、環境変数 LC_CTYPEは、ファイル名が表示
されるとき、どの文字を表示不可能 (unprintable) と見なすかにもかかわることになる。「変わり者のファ
イル名」セクションを参照していただきたい。
LC_MESSAGES
国際化されたメッセージで使用するロケールを決める。環境変数 `POSIXLY_CORRECT' が設定されている場合
でも、やはりこの変数によって、アクション -ok が出したプロンプトに対する応答をどう解釈するかが決
まってくる。
NLSPATH
国際化メッセージ・カタログを置く場所を決める。
PATH -exec, -execdir, -ok, -okdir によって呼び出される実行ファイルを捜すために検索するディレクトリに影
響する。
POSIXLY_CORRECT
-ls や -fls が使用するブロックサイズを決める。POSIXLY_CORRECT が設定されているときは、1 ブロック
512 バイト、設定されていないときは、1 ブロック 1024 バイトである。
また、この変数を設定すると、警告メッセージを出さないのがデフォルトになる (すなわち、 -nowarn にな
るわけだ)。なぜならば、POSIX の規定では、-ok の出すプロンプトを除いて、標準エラーに出力されるメッ
セージは、すべて問題が起きたことを知らせるものであり、 そのときの終了ステータスは 0 以外でなければ
ならないからである。
POSIXLY_CORRECT が設定されていない場合は、+zzz が許可属性を表すシンボルとしてそれ自体有効な表現で
あるときを除き、-perm +zzz は -perm /zzz とまったく同じように扱われる (訳注: 現在では、
POSIXLY_CORRECT が設定されていない場合も、-perm +mode の書式はサポートされていない。検査 -perm の
説明を参照)。POSIXLY_CORRECT が設定されている場合は、許可属性の前に '+' を取る形式は、エラーとして
処理される (訳注: もちろん、+zzz がそれ自体有効なシンボル表現であるときは除く。たとえば、-perm
+u+x といったものがそういう表現である。これは、-perm 0111 という「ぴったり一致する」表現と等価にな
る)。
POSIXLY_CORRECT が設定されていると、アクション -ok が出すプロンプトに対するユーザの応答を解釈する
際に、find の持つメッセージ翻訳ではなく、システムのメッセージ・カタログが参照される。
TZ タイムゾーンに影響する。タイムゾーンは、-printf や -fprintf の日時に関係する一部の書式指定子で使用
される。
用例
find /tmp -name core -type f -print | xargs /bin/rm -f
/tmp ディレクトリ以下に core という名前のファイルを捜して、それを消去する。 ファイル名 (パスを含む) の中
に改行、シングルクォート、ダブルクォート、 空白などを含むものがあると、正しく動作しないので、注意するこ
と。
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
/tmp ディレクトリ以下に core という名前のファイルを捜して、それを消去する。 ファイル名の処理に当たって
は、ファイルやディレクトリの名前にシングルクォート、ダブルクォート、空白、改行などが含まれていても、適切
に扱われるようにしている。 検査 -name を -type の前に置いているのは、すべてのファイルに対して stat(2) シ
ステムコールを行う無駄を省くためである。
find . -type f -exec file '{}' \;
カレントディレクトリ以下のあらゆるファイルに対して file コマンドを実行する。 波カッコをシングルクォートで
囲んでいることに注目していただきたい。 シェルスクリプトのブロック区切り記号として解釈されないようにするた
めである。 同様に、セミコロンもバックスラッシュを使って保護している。 こちらにもシングルクォートを使用し
てもよい。
find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
\( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
全ファイルシステムを一回だけ探索して、setuid ビットの立っているファイルやディレクトリのリストを
/root/suid.txt に、サイズの大きいファイルのリストを /root/big.txt に出力する。
find $HOME -mtime 0
ここ 24 時間の内に内容が更新されたファイルをホームディレクトリ以下で検索する。 このコマンドがそういう動作
になるのは、それぞれのファイルが最後に更新されてから現在までの経過時間が、24 時間で割られて、余りは捨てら
れるからである。 そこで、ファイルが -mtime 0 にマッチするためには、過去 24 時間未満の期間内に内容が更新さ
れていなければならないことになる。
find /sbin /usr/sbin -executable \! -readable -print
実行可能でありながら、読み出し不可能なファイルを捜す。
find . -perm 664
ファイルの所有者とグループは読むことも書くことも可能だが、他のユーザは読み出しのみ可能で書き込みはできな
いファイルを捜す。 そうした条件を満たすものの、他の許可属性ビットも立っているような (たとえば、そのファイ
ルを実行できる人がいるような) ファイルは、この式にマッチしない。
find . -perm -664
ファイルの所有者とグループは読むことも書くことも可能であり、他のユーザも読むことが可能であるようなファイ
ルを捜す。 それ以外の許可属性ビットについては (たとえば、実行許可ビット)、立っていてもいなくてもかまわな
い。この条件は、たとえば、 0777 のモードを持つファイルにもマッチすることになる。
find . -perm /222
書き込める人のいるファイルを捜す (書き込めるのは、ファイルの所有者でも、グループでも、他の一般ユーザでも
よい)。
find . -perm /220
find . -perm /u+w,g+w
find . -perm /u=w,g=w
上記のコマンドは三つとも同じ動作をする。最初のものは、ファイルの許可属性を 8 進数で表し、後の二つは、シン
ボルによる表現形式を使っている。 こうしたコマンドはどれも、ファイルの所有者やグループが書き込み可能なファ
イルを捜す。 所有者とグループの両方が書き込み可能な場合しか、マッチしないわけではない。 どちらか片方だけ
でも十分である。
find . -perm -220
find . -perm -g+w,u+w
この二つのコマンドは同じ動作をする。すなわち、ファイルの所有者とグループの両方が書き込み可能なファイルを
捜す。
find . -perm -444 -perm /222 \! -perm /111
find . -perm -a+r -perm /a+w \! -perm /a+x
この二つのコマンドは両方とも次のような条件のファイルを捜す。 その条件とは、誰にでも読み出すことが可能で
(-perm -444 や -perm -a+r がそれにに当たる)、書き込み許可ビットが少なくとも一つは立っているが (-perm /222
や -perm /a+w)、誰にも実行することはできない (! -perm /111 や ! -perm /a+x) というものである。
cd /source-dir
find . -name .snapshot -prune -o \( \! -name '*~' -print0 \)|
cpio -pmd0 /dest-dir
このコマンドは /source-dir の中身を /dest-dir にコピーするが、 その際 .snapshot という名前のファイルや
ディレクトリ (及び、そのディレクトリ内にあるもの) を除外している。 さらにこのコマンドは、名前の末尾に ~
が付くファイルやディレクトリも除外するが、 そうしたディレクトリの中身については除外の対象にしない。
-prune -o \( ... -print0 \) という構文はかなりよく利用される。 ここで肝腎なのは、-prune の前にある式が
マッチする項目は、find の探索の対象から -prune によって取り除かれる (訳注: pruned、枝刈りされる) というこ
とである。 しかし、アクション -prune 自体は返り値として真を返すので、直後に続く -o によって、探索の対象か
ら取り除かれなかったディレクトリに対してだけ -o の右辺の評価が行われることになる (探索の対象から取り除か
れたディレクトリの中身は、処理の対象にすらならないのだから、そうしたものはもう関係がない)。 -o の右辺の式
をカッコで囲んでいるのは、見やすくするためにすぎない。 アクション -print0 が行われるのは、 -prune が適用
されなかった項目のみであることを強調しているだけだ。 述語間のデフォルトの結合は and であり、and の結合は
-o よりも強いから、 カッコがあってもデフォルトの動作と同じなのだが、カッコを使うと、何をやっているかがわ
かりやすくなる。
find repo/ \( -exec test -d {}/.svn \; -or \
-exec test -d {}/.git \; -or -exec test -d {}/CVS \; \) \
-print -prune
以下のようなプロジェクトのディレクトリとそれに関連する SCM (ソースコード管理システム) の管理用ディレクト
リがある場合に、プロジェクトのルートを効率的に検索する。
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
この例では、-prune を使うことによって、すでにプロジェクトのルートであることがわかったディレクトリ以下で不
必要な探索をしないですませている (たとえば、project3/src は探索しないが、それは project3/.svn がすでに見
つかっているからだ)。それでいて、同格のディレクトリ (たとえば、 project2 と project3) はきちんと見つかる
ようにしている。 (訳注: この例の場合、カッコは必要である。and の結合は or よりも強いので。)
終了ステータス
find は、すべてのファイルを問題なく処理できれば、ステータス 0 で終了する。 エラーが起きた場合の終了ステー
タスは、1 以上である。 ここではあえてごく大雑把な言い方をしているが、返り値が 0 以外だった場合は、find が
出した結果を正しいと思い込まない方がよいだろう。
エラーが起きた場合、find は、指定されたすべての動作を完了せず、 その場で終了してしまうことがある。その場
合は、たとえば、探索開始点のあるものが調査されなかったり、 -exec ... {} + や -execdir ... {} + で呼び出さ
れることになっているプログラムに実行されないものが生じたりするかもしれない。
関連項目
locate(1), locatedb(5), updatedb(1), xargs(1), chmod(1), fnmatch(3), regex(7), stat(2), lstat(2), ls(1),
printf(3), strftime(3), ctime(3)
find については、充実した関連文書が Texinfo マニュアルの形で保守されている。 info と find プログラム
が、御使用のサイトできちんとインストールされているならば、 info find とコマンドを打ち込むことで、詳細なマ
ニュアルが読めるはずだ。 (訳注: info find だと、説明が途中からになるので、info "Finding files" と打ち込む
ことをお勧めする。)
履歴
findutils-4.2.2 以来、ファイル名のパターンに使われるシェルのメタ文字 (`*', `?', `[]' など) は、先頭の `.'
にマッチする。 これは、IEEE POSIX interpretation 126 がそう要求しているからである。
findutils-4.3.3 以来、-perm /000 は、どんなファイルにもマッチしないではなく、すべてのファイルにマッチす
る、になっている。
ナノ秒まで表現するタイムスタンプは findutils-4.3.3 で実装された。
findutils-4.3.11 以来、アクション -delete は、実行に失敗すると、 find の終了ステータスを 0 以外の値にす
る。とは言え、find がその場で即座に終了してしまうわけではない。以前のバージョンでは、-delete が実行に失敗
しても、find の終了ステータスは影響を受けなかった。
Feature Added in Also occurs in
-newerXY 4.3.3 BSD
-D 4.3.1
-O 4.3.1
-readable 4.3.0
-writable 4.3.0
-executable 4.3.0
-regextype 4.2.24
-exec ... + 4.2.12 POSIX
-execdir 4.2.12 BSD
-okdir 4.2.12
-samefile 4.2.11
-H 4.2.5 POSIX
-L 4.2.5 POSIX
-P 4.2.5 BSD
-delete 4.2.3
-quit 4.2.3
-d 4.2.3 BSD
-wholename 4.2.0
-iwholename 4.2.0
-ignore_readdir_race 4.2.0
-fls 4.0
-ilname 3.8
-iname 3.8
-ipath 3.8
-iregex 3.8
-perm +MODE という書き方は、findutils-4.5.12 で廃止された。代わりに、-perm /MODE を使用すること。 +MODE
という記法は、2005 年にリリースされた findutils-4.2.21 以来非推奨になっていた。
バグにあらず
$ find . -name *.c -print
find: paths must precede expression
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
こうしたエラーが起きる原因は、 *.c がシェルによって展開されて、find が実際に受け取るコマンドラインが、た
とえば次のようなものになってしまうからである。
find . -name bigram.c code.c frcode.c locate.c -print
当然ながら、こんなコマンドがうまく動くわけがない。書き方を改めて、パターンを引用符で囲むか、ワイルドカー
ドをエスケープするべきだ。
$ find . -name '*.c' -print
$ find . -name \*.c -print
バグ
POSIX 規格が find について規定している動作には、セキュリティ上の問題があるが、 それはその動作に内在する問
題なので、修正することができない。一例を挙げると、アクション -exec は本質的に安全ではない。だか
ら、-execdir の方を使うべきなのだ。より詳しい情報については、Finding Files をご覧いただきたい。
環境変数 LC_COLLATE はアクション -ok にまったく影響を及ぼさない (訳注: 環境変数 LC_COLLATE の説明では 「
この変数はアクション -ok に対する応答の解釈にも影響を及ぼす」と述べている)。
バグ報告の最善の方法は、http://savannah.gnu.org/bugs/?group=findutils にある書式を使用することである。そ
うすれば、問題解決の進行状態を追うことができるからだ。 find(1) や findutils パッケージ全般についてのその
他のご意見は、 bug-findutils メーリングリストにお出しになればよい。 メーリングリストに参加するに
は、bug-findutils-request@gnu.org 宛に E メールを送っていただきたい。
翻訳について
この翻訳は findutils-4.6.0 所収の find.1 の翻訳である。 お手元の findutils は、もっと新しいバージョン、た
とえば 4.7.0-git になっているかもしれない。だが、4.7.0 は開発中の版なので、manpage も変化し続けており、現
時点で最新の 4.7.0 のマニュアルを翻訳しても、お手元の英語マニュアルとは内容が微妙に違うかもしれないのだ。
バージョンが同じ 4.7.0 なのに、それでは紛らわしい。そこで、あえて現在の安定版、4.6.0 のマニュアルを底本に
した。
4.6.0 と最近の 4.7.0-git との大きな相違は、-D のデバックオプションに exec と search が増えていること
と、検査 -type や -xtype で "-type f,l" などと、複数のファイルタイプをコンマで区切って指定できるように
なったことくらいである。
なお、バージョン 4.4.2 までの翻訳では、述語の Test (-mtime, -name, -type など) を「判別式」と訳してきた
が、今回は素直に「検査」と訳すことにした。同じものである。 「条件、条件式、検索式、検索条件、テスト」など
の訳語もあったと思う。 これまでの「判別式」という訳語に慣れた方には、ご迷惑だったかもしれない。 お許しい
ただきたい。(2018/03/03)
FIND(1)