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)