[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2. ファイル検索

デフォルトで,findは標準出力に,与えられた基準にマッチするファイ ルの名前を出力します.マッチしたファイルに関する詳細を取得する方法は, See section アクション.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 名前

基準パターンにマッチする名前を持つファイルを検索する方法は,以下のよう になります.これらのテストでのpattern引数の記述については, See section シェルパターンマッチング.

これらのテストには,`i'で始まる名前を持つ,大文字小文字を区別バー ジョンと区別しないバージョンがあります.大文字小文字を区別しない比較で は,パターン`fo*'`F??'は,ファイル名`Foo'`FOO'`foo'`fOo'等にマッチします.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1.1 ベース名のパターン

Test: -name pattern
Test: -iname pattern

ファイル名のベース(前置されるディレクトリが削除されたパス)がシェルパター ンpatternにマッチする場合は真です.`-iname'の場合は,大文字 小文字の区別をしないマッチです.ディレクトリツリー全体を無視するために, `-prune'を使用して下さい(see section ディレクトリ).例として, `/usr/local/doc'のTexinfoソースファイルを見つけるため以下のように します.

 
find /usr/local/doc -name '*.texi'

ワイルドカードは,シェルでの展開から守るため,確実に引用符で囲む必要が あることに注意してください.

`-name'`-iname'に対するパターンは,前に`.'が付いている ファイル名にもマッチします.例えば,コマンド`find /tmp -name \*bar' はファイル`/tmp/.foobar'にマッチします.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1.2 完全なファイル名のパターン

Test: -wholename pattern
Test: -iwholename pattern

コマンドライン引数で始まる見つかったファイルのファイル名全体が,シェル パターンpatternにマッチする場合は真になります. `-iwholename'では,マッチ時に大文字小文字を区別します.ディレクト リツリーのすべてのファイルを調査するのではなく,ディレクトリツリー全体 を無視するために,`-prune'を使用してください(see section ディレクトリ). findが使用する"entire file name"は,コマンドラインで指定す る起点で,絶対パスに変換されないので,例えば,cd /; find tmp -wholename /tmpでは何にもマッチしません.

Test: -path pattern
Test: -ipath pattern

これらのテストは推奨されませんが,`-wholename'`-iwholename'は,それぞれ動作します.`-ipath'のテストはGNUの 拡張ですが,`-path'はHP-UX findでも提供されています.

Test: -regex expr
Test: -iregex expr

ファイル名全体が正規表現exprにマッチする場合は真です.これはパス 全体へのマッチで,サーチではありません.例えば,`./fubar3'というファ イル名にマッチさせるため,正規表現`.*bar.'`.*b.*3'は使用可 能ですが,`f.*r3'は不可能です.正規表現の構文の記述は, See (emacs)Regexps section `Syntax of Regular Expressions' in The GNU Emacs Manual. `-iregex'の場合は,大文字小文字を区別しません.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1.3 すばやい完全な名前の検索

実際にディスク上のディレクトリをスキャンすることなく(きっと遅いでしょ う),ファイルを名前で検索するために,locateプログラムを使用する ことが可能です.与えたそれぞれのシェルパターンに対し,locateは, 一つ,またはそれ以上のファイル名のデータベースを検索し,パターンを含む ファイル名を表示します.シェルパターンの詳細は,See section シェルパターンマッチング.

パターンが--メタ文字を含まない--通常の文字列の場合,locateは, 文字列を含むすべてのファイル名を表示します.パターンがメタ文字を含む場 合,locateはパターンに正確にマッチしているファイル名のみ表示しま す.結果として,メタ文字を含むパターンは,通常`*'で開始すべきで, 同じもので終わることが最も多くなっています.例外は,ファイル名の最初ま たは最後への,明示的なマッチを試みるパターンです.

locateをファイル名の最後の部分(ファイルの"ベース名")に対しての みマッチさせたい場合,`--basename'を使用することが可能です.反対の 動作がデフォルトですが,`--wholename'オプションを使用して,明示的 に選択することが可能です.

以下のコマンドを考えます.

 
locate pattern

以下とほとんど等価です.

 
find directories -name pattern

ここでのdirectoriesは,情報を含んでいるファイル名データベースのディ レクトリです.違いはlocate情報が古い可能性があり,そして, locatefindとわずかに異なるパターンでワイルドカードを扱 うことです(see section シェルパターンマッチング) .

ファイル名データベースには,データベースが最後に更新されたときにシステ ムに存在したファイルのリストが含まれています.システム管理者はデフォル トのデータベースのファイル名,データベースを更新する頻度,そして,エン トリーを含むディレクトリを選択することが可能です.

locateが検索するファイル名データベースを選択する方法は以下のよう になります.デフォルトはシステムに依存します.

--database=path
-d path

デフォルトのファイル名データベースを検索する代わりに,path内のファ イル名データベースを検索し,それはコロンで分けられたデータベースのファ イル名リストとなります.検索するデータベースファイルのリストを設定する ために,環境変数LOCATE_PATHを使用することも可能です.両方使用さ れている場合,オプションは環境変数に優先します.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1.4 シェルパターンマッチング

findlocateは,ファイル名やファイル名の一部を,シェルパ ターンと比較することが可能です.シェルパターン(hell pattern)は, 以下の特殊文字を含む文字列で,それはワイルドカード(wildcards)メタ文字(metacharacters)として知られています.

メタ文字を含むパターンを,シェルがそれ自身を展開することから避けるため 引用符で囲む必要があります.二重引用符とシングル引用符の両方が動作しま す.そのため,(それ自身は)バックスラッシュでエスケープします.

*

ゼロ以上の文字にマッチします.

?

あらゆる一文字にマッチします.

[string]

文字列stringに存在する,正確に一文字にマッチします.これは文 字集合(character class)と呼ばれます.短いものとして,stringには 範囲を含めることが可能で,それは間にダッシュがある二つの文字です.例え ば,集合`[a-z0-9_]'は小文字,数字,またはアンダースコアです. `!'`^'を開括弧の前に配置することで,否定集合も可能です. このため,`[^A-Z@]'は大文字とアットマーク以外にマッチします.

\

それ以降の特殊文字の意味をなくします.これは文字集合でも動作します.

findがシェルのパターンマッチ(`-name'`-wholename'等) で行なうテストでは,パターンの中のワイルドカードはファイル名の最初の `.'にマッチしません.これはlocateではそうなりません.このた め,`find -name '*macs''`locate '*macs''だけでなく `.emacs'にもマッチします.

スラッシュ文字は,findlocateが行なうシェルのパターンマッ チでは特殊な意味が無いので,ワイルドカードがそれにマッチしないシェルと は異なります.そのため,パターン`foo*bar'はファイル名 `foo3/bar'にマッチし,パターン`./sr*sc'はファイル名 `./src/misc'にマッチするはずです.

`locate'コマンドでファイルの場所を知りたいが,完全なリストを見る必 要は無い場合,ちょっとした数の結果を見る`--limit'オプションや,マッ チの総数だけを表示する`--count'オプションを使用することが可能です.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 リンク

ファイルをお互いにリンクすること可能にする方法は二つあります.シン ボリックリンク(symbolic link)は,他のファイルの名前の部分が内容になる, ファイルの特殊な形式です.ハードリンク(hard link)は,一つのファイ ルに対する,複数のディレクトリエントリです.ファイル名はすべて,同じイ ンデックスノード(inode)番号をディスク上に持ちます.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2.1 シンボリックリンク

シンボリックリンクとは,他のファイルを参照する名前です.GNU findは,シンボリックリンクを二つの方法のいずれかで処理します.最 初のものは,リンク先を参照する方法で,これはシンボリックリンクの場合は, 指定した特徴にマッチするかどうかを確認するため,リンク先のファイルを調 査することを意味します.二番目の方法は,実際のリンクを探している状況で, リンク自身を調査することが可能です.シンボリックリンクのリンク先のファ イルも,findコマンドで検索しているディレクトリ階層にある場合,こ れら二つの選択肢の違いを詳しく理解しておく必要はありません.

デフォルトで,findはシンボリックリンクが見つかると,それ自身を調 査します(そして,その後でリンク先のファイルをたどり,それも調査します). findにリンク先を参照するようにし,リンクが示すファイルを調査させ るため,find`-L'オプションを指定してください.デフォルト の動作を明示的に指定するため,`-P'オプションを使用することが可能で す.`-H'オプションは中間的なオプションで,コマンドラインでリストアッ プされているシンボリックリンクはリンク先を参照しますが,それ以外のシン ボリックリンクはリンク先を参照しません.

シンボリックリンクは"ハードリンク"とは異なり,リンク先を参照可能にす るために,リンク先のファイルへの権限が必要になることを意味します.つま り,`-L'オプションを指定している場合でも,findはリンクが示 すファイルの属性を(十分な権限が無いという理由で)調査することができない 可能性があります.この状況では,`find'はリンク自身の属性を使用しま す.シンボリックリンクは存在するが,それが指し示すファイルが無い場合も, 同じようなことになります.

リンクに関連したfindの動作を制禦するオプションには,以下のものが あります.

`-P'

findはシンボリックリンク先を参照しません.これはデフォルトの動作 です.このオプションは,コマンドラインのパス名の前に指定する必要があり ます.

`-H'

findはシンボリックリンク先を参照しません(しかし,コマンドライン 上ののファイル名はリンク先を参照します).シンボリックリンク先を参照でき ない場合,シンボリックリンク自身の情報が使用されます.このオプションは, コマンドラインのパス名の前に指定する必要があります.

`-L'

findは,可能であればシンボリックリンク先を参照し,不可能なところ では,シンボリックリンク自身の属性を使用します.このオプションはコマン ドラインのパス名の前に指定する必要があります.このオプションを使用する と,`-noleaf'オプションと同じ動作も暗黙に指定されます.後で `-H'`-P'オプションを使用する場合でも,`-noleaf'はオフ になりません.

`-follow'

このオプションは,"expression"の部分の形式で,パス名の後に指定する必 要がありますが,それ以外は`-L'と同じです.

`-L'オプションを与えた時の動作には,以下の違いがあります.

`-L'オプションまたは`-H'オプションが使用されている場合, `-newer'`-anewer',そして`-cnewer'の引数として使用され ているファイル名は,リンク先を参照され,リンク先のタイムスタンプが代わ りに使用されます(可能であれば - そうでなければ,シンボリックリンクのタ イムスタンプが使用されます).

Test: -lname pattern
Test: -ilname pattern

ファイルがシェルパターンpatternにマッチする内容のシンボリックリン クの場合は真です.`-ilname'は,大文字小文字を区別しないマッチです. pattern引数の詳細は,See section シェルパターンマッチング. `-L'の 効果がある場合,このテストはシンボリックリンクが壊れていない限り,常に 失敗します.そして,現在のディレクトリとそのサブディレクトリ内の, `sysdep.c'へのシンボリックリンクをすべてリストアップするために,以 下のように実行します.

 
find . -lname '*sysdep.c'

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2.2 ハードリンク

ハードリンクは,同じファイルを参照する一つ以上の名前を提供します.同じ ファイルを参照している全てのファイルをNAMEで見つけるため, `-samefile NAME'を使用してください.`-L'オプションを使用して いない場合,`-xdev'オプションを使用して,検索を一つのファイルシス テムに制限することが可能です.ハードリンクは単一のファイルシステム以外 を指し示すことができないため,不必要な検索を停止することができるので, これは役に立ちます.

`-L'オプションの効果があり,NAMEが実際にはシンボリックリンク の場合,シンボリックリンクの参照先を参照します.このため,NAMEが 示すファイル以外のリンク(ハードリンクまたはシンボリックリンク)を検索し ます.`-L'の効果があり,NAMEがシンボリックリンクではない場合, ファイルNAMEへのシンボリックリンクがマッチします.

inode番号でファイルを検索することも可能です.例えば,ファイルシステムの 問題を診断するとき,fsckがinode番号を出力するので,これは役に立 ちます.inode番号は,ソフトウエアのログメッセージの形式で出力されること もあり,ftok()ライブラリ関数のサポートで使用されています.

ファイルのinode番号とリンク数を`ls -li'`find -ls'で知ること が可能です.

inode番号NUMへのハードリンクを`-inum NUM'で検索することが可 能です.検索を開始したディレクトリ以下に,ファイルシステムのマウントポ イントがある場合,`-L'オプションを使用していない場合は `-xdev'オプションを使用してください.ハードリンク差機のファイルは 同じファイルシステムであることが必要なので,`-xdev'を使用すること で不必要な検索といった無駄を省きます.

Test: -samefile NAME

NAMEと同じinodeを持つファイルの調査です.`-L'オプションに効 果がある場合,同一ファイルNAMEへのシンボリックリンクもマッチしま す.

Test: -inum n

inode番号nを持つファイルの調査.`+'`-'の修飾辞も動作 するのですが,滅多に役に立ちません.

`-links'を用いると,特定の数のリンクを持つファイルを検索することも 可能です.ディレクトリは通常,少なくとも二つのハードリンクがあります. それらの`.'エントリは二番目のものです.サブディレクトリがある場合, それは個別に親ディレクトリを示す`..'と呼ばれるハードリンクもありま す.通常,`.'`..'のディレクトリエントリーは,findの コマンドラインに書かれていない限り検索されません.

Test: -links n

n個のハードリンクを持つファイルの調査.

Test: -links +n

n個の以上のハードリンクを持つファイルの調査.

Test: -links -n

n個未満ののハードリンクを持つファイルの調査.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 時間

それぞれのファイルには三つのタイムスタンプがあり,それらはファイルに対 して特定の処理を実行した,最後の時間を記録します.

  1. アクセス(ファイルの内容を読み込む)
  2. ステータスの変更(ファイルの編集や属性の変更)
  3. 編集(ファイルの内容を変更)

ファイルが作成された時間を示すタイムスタンプはありません.

タイムスタンプが特定の範囲にあるファイルを検索したり,他のタイムスタン プと比較したりすることが可能です.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.1 期間の範囲

これらのテストは,範囲(`+n'`-n')を用いる場合に, 主に役立ちます.

Test: -atime n
Test: -ctime n
Test: -mtime n

ファイルの最後のアクセス(またはステータスの変更,または編集)が, n*24時間前の場合は真です.24時間の数の区切りは,ファイルのタイム スタンプが常に切り捨てで処理されます.このため,0は"24時間未満",1は "24〜48時間の間"といった感じになります.

Test: -amin n
Test: -cmin n
Test: -mmin n

ファイルの最後のアクセス(またはステータスの変更,または編集)が, n分前の場合は真です.これらのテストは,`-atime'等よりも細か な計測を提供しますが,同じ方法で切り捨てられます.例えば, `/u/bill'内の最後に読み込まれたのが2〜6分前のファイルをリストアッ プするために以下のようにします.

 
find /u/bill -amin +2 -amin -6
Option: -daystart

24時間前ではなく今日の最初から時間をはかります.そのため,ホームディレ クトリ内で昨日編集された通常のファイルをリストアップするために,以下の ようにします.

 
find ~ -daystart -type f -mtime 1

`-daystart'オプションは,それ以外のオプションとは異なり,他の調査 の実行に効果を与える方法です.影響される調査は,`-amin'`-cmin'`-mmin'`-atime'`-ctime',そして `-mtime'です.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.2 タイムスタンプの比較

タイムスタンプを現在の時間と比較する代わりに,それを他のファイルのタイ ムスタンプと比較することが可能です.そのファイルのタイムスタンプは,い くつかのイベントによって,他のプログラムによって更新されるかもしれませ ん.また,touchコマンドを使用して,特定の固定した日付に設定する こともできるでしょう.例えば,今年の一月一日以降に編集された `/usr'内のファイルをリストアップするために,以下のようにします.

 
touch -t 02010000 /tmp/stamp$$
find /usr -newer /tmp/stamp$$
rm -f /tmp/stamp$$
Test: -anewer file
Test: -cnewer file
Test: -newer file

ファイルが最後にアクセス(またはステータスの変更,または編集)されたのが fileの編集以降の場合は真です.これらのテストは,`-follow'が コマンドラインのそれら(のオプション)の前にある場合のみ,`-follow' 影響を受けます.

 
find . -newer /bin/sh
Test: -used n

ファイルが最後にアクセスされたのが,そのステータスが最後に変更されてか らn日後の場合は真です.使用されておらず,ディスクスペースを確保す るために圧縮または削除されたファイルを探すのに役立ちます.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 サイズ

Test: -size n[bckwMG]

切上げでn単位領域をファイルが使用している場合は真です.単位はデフォ ルトで512バイトブロックですが,nの接尾子として一文字加えることで 変更することが可能です.

b

512バイトブロック単位(1024にはなりません)

c

バイト単位

k

キロバイト(1024バイト)単位

w

2バイトワード単位

M

メガバイト単位

G

ギガバイト単位

`b'の接尾辞は常に512バイトのブロックを想定します.これは, POSIXLY_CORRECT環境変数の設定(または未設定)に影響されません.この の動作は`-ls'の動作とは異なります.1024バイト単位を使用したい場合, `k'接尾辞を代わりに使用してください.

数字には`+'や`-'を前置することが可能です.正の符号は,ストレージ内でファ イルが少なくともn単位を使用している場合,調査が成功したことを示し (これは,このテストが使用する一般的な方法です),負の符号は,ストレージ 内でファイルがn単位未満使用している場合,調査が成功したことを示し ます.`='接頭辞は無く,これはデフォルトだからです.

サイズは間接的なブロックを数えませんが,実際には割り当てられていない疎 らなファイル内のブロックは数えます.言い替えると,`ls -l'`wc -c'で得られる結果と矛盾します.この疎らなファイルの処理は, `-printf'指示語の`%k'`%b'の書式指定の出力とは異なりま す.

Test: -empty

ファイルが空の場合で,通常のファイルまたはディレクトリのどちらかの場合 は真です.これで,削除に適した候補が作成されるでしょう.このテストは, `-depth' (see section ディレクトリ)と`-delete' (see section 単一のファイル)とともに用いた場合,役に立ちます.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 ファイル形式

Test: -type c

ファイルがcの形式の場合は真です.

b

(バッファされる)ブロックスペシャルファイル

c

(バッファされない)キャラクタスペシャルファイル

d

ディレクトリ

p

名前付きパイプ(FIFO)

f

通常のファイル

l

シンボリックリンク

s

ソケット

D

door (Solaris)

Test: -xtype c

ファイルがシンボリックリンクでない場合,`-type'と同じです.シンボ リックリンクに対しては以下のようになります.`-follow'が与えられて いない場合,ファイルがc形式のファイルにリンクしている場合は真です. `-follow'が与えられている場合,c`l'の場合は真です.言 い替えると,シンボリックリンクに対し,`-xtype'は,`-type'が調 査しないファイルの形式を調査します.`-follow'の詳細は, See section シンボリックリンク.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 所有者

Test: -user uname
Test: -group gname

ファイルが(グループgnameに所属する)ユーザunameに所有されて いる場合は真です.数字のIDも可能です.

Test: -uid n
Test: -gid n

ファイルの数字のユーザID(グループID)がnの場合は真です.これらのテ ストは,`-user'`-group'とは異なり,範囲指定 (`+n'`-n')をサポートします.

Test: -nouser
Test: -nogroup

ファイルの数字のユーザIDに対応するユーザがいない(数字のグループIDに対応 するグループがない)場合は真です.これらの場合は,通常,システムから削除 されているため,ユーザに属さなくなったファイルを意味します.そのような ファイルの所有権を,chownchgrpプログラムを使用して,既 存のユーザとグループに変更したほうが良いでしょう.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.7 ファイルの権限

ファイルの権限の構造とそれを指定する方法に関する情報は,See section ファイルの権限.

Test: -perm mode

ファイルの権限が正確にmode(数値的でも象徴的でも可能です)と同一の 場合は真です.

mode`-'で始まっている場合,modeの権限がすべ てファイルに設定されている場合は真です.modeに設定されていない権 限は無視されます.mode`/'で始まっている場合,modeの 権限がひとつでもファイルに設定されている場合は真です. modeに設定されていない権限は無視されます.これはGNUの拡張です.

`/'`-'の形式を記号的なモードの文字列で使用していない場合, より複雑なモード文字列を指定する必要があるかもしれません.例えば, `-perm g=w'はモードが0020のファイルだけにマッチします(つまり,グルー プの書き込み権限だけ権限が設定されているものです).`/'`-'の 形式のほうがより好ましい結果でしょう.例えば,`-perm -g=w'は,グルー プの書き込み権限がある,すべてのファイルにマッチします.

`-perm 664'

所有者とグループに読み込みと書き込みの権限があり,それ以外は読み込み可 能で書き込み不可能なファイルにマッチします.これらの基準に合致したファ イルで,それ以外の権限のビットが設定されているもの(例えば,実行可能なファ イル)にはマッチしません.

`-perm -664'

所有者とグループに読み込みと書き込みの権限があり,それ以外は読み込み可 能で書き込み不可能なファイルにマッチし,それ以外の権限ビット(例えば,実 行権限ビット)の存在に依存しません.例えばこれは,0777のモードのファイル にマッチします.

`-perm /222'

書き込み権限があるファイル(所有者,グループ,またはそれ以外誰でも)にマッ チします.

`-perm /022'

所有者またはグループに書き込み権限があるファイルにマッチします.マッチ するためには,ファイルに所有者とグループの両方の書き込み権限がある必要 はありません.いずれかでマッチします.

`-perm /g+w,o+w'

上記と同じです.

`-perm /g=w,o=w'

上記と同じです.

`-perm -022'

所有者とグループの両方の書き込み権限があるファイルを検索します.

`-perm -g+w,o+w'

上記と同じです.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.8 内容

ファイルの内容を基に検索するために,grepプログラムを使用すること が可能です.例えば,現在のディレクトリで,文字列`thing'を含むCのソー スファイルを見つけるために,以下のようにすることが可能です.

 
grep -l thing *.[ch]

サブディレクトリのファイルの文字列を検索したい時も,以下のように findxargsを用いて,grepを組み合わせることが可能 です.

 
find . -name '*.[ch]' | xargs grep -l thing

grep`-l'オプションで,文字列を含む行ではなくそれを含むファ イル名のみ出力します.文字列の引数(`thing')は,実際には正規表現で, そのためメタ文字を含みます.この方法で,findの出力がない場合は xargsgrepを実行させないように,`-r'オプションを使 用したり,名前にスペースを含んでいて間違って解釈することを防ぐために, findのアクション`-print0'xargsのオプション `-0'を使用することで改善可能です.

 
find . -name '*.[ch]' -print0 | xargs -r -0 grep -l thing

パターンにマッチする内容があるファイルを見つけるためのより完全な扱いは, grepのマニュアルページを参照して下さい.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.9 ディレクトリ

ディレクトリでのfindの検索を制御し,それらを検索する方法がここに あります.これらの二つのオプションで,ディレクトリツリーを輪切りにする 処理が可能となります.

Option: -maxdepth levels

コマンドライン引数以下の,最大levels (正の整数)のレベルのディレク トリまで下ります.`-maxdepth 0'はコマンドライン引数のみ,テストと アクションを適用することを意味します.

Option: -mindepth levels

levels (正の整数)未満のレベルではテストもアクションも適用しません. `-mindepth 1'はコマンドライン引数以外のすべてのファイルを処理する ことを意味します.

Option: -depth

ディレクトリ自身の前に,それぞれのディレクトリの内容を処理します. cpiotarでファイルのリストを生成する時,これを行なうのは 良い考えです.ディレクトリにその所有者に対する書き込み権限がない場合, ディレクトリの権限はその内容の後で復元されるため,その内容はアーカイブ から復元することが可能です.

Option: -d

これは,`-depth'の推奨されない同意語で,Mac OS X,FreeBSD,そして OpenBSDとの互換性が目的です.`-depth'オプションはPOSIXの機能なので, そちらを使用したほうが良いでしょう.

Action: -prune

ファイルがディレクトリの場合,その中まで下って行きません.結果は真です. 例えば,ディレクトリ`src/emacs'と,そのすべてのファイルと,それ以 下のディレクトリを省略し,それ以外で見つかったファイルの名前を出力する ために以下のようにします.

 
find . -wholename './src/emacs' -prune -o -print

上記のコマンドでは,結果リストに`./src/emacs'を出力しません.しか し,これは`-prune'の動作の影響が原因ではありません(それ以上,下っ て行くのを避けるだけで,その項目を確実に無視するわけではありません).そ うではなく,これは`-o'を使用していることが原因です.左側の"or"条 件が`./src/emacs'で成功しているので,この指定しているファイルに対 する右側の評価(`-print')が不要になります.ディレクトリ名を出力した い場合,さらに`-print'アクションを使用します.

 
find . -wholename './src/emacs' -prune -print -o -print

または,カンマ・オペレータを使用します.

 
find . -wholename './src/emacs' -prune , -print

`-depth'オプションの影響がある場合,サブディレクトリはあらゆる状況 で調査されています.このため,`-prune'に効果はありません.

Action: -quit

すぐに修了します(エラーが無ければ,ゼロの値を返します).実行中の子プロ セスは無く,コマンドラインで指定されたパスの処理も無い状態になります. 例えば,find /tmp/foo /tmp/bar -print -quitでは`/tmp/foo'だ けを出力します.

Option: -noleaf

ディレクトリが,ハードリンクの数より二つ少ないサブディレクトリを含むこ とを仮定することで,最適化を行ないません.このオプションは,CD-ROMや MS-DOSファイルシステムやAFSボリュームマウントポイントといった,Unixのディ レクトリリンクの規約に従わないファイルシステムを検索する時に必要です. 通常のUnix のファイルシステムのそれぞれのディレクトリは,少なくとも二つ のハードリンクがあります.その名前とその`.'エントリです.更に,そ のサブディレクトリ(が存在する場合)には,そのディレクトリにリンクしてい る`..'エントリが,それぞれにあります.findがディレクトリを 調査している時,ディレクトリのリンク数よりサブディレクトリが二つ少ない ことがはっきりした後で,それはディレクトリのエントリの残りがディレクト リでない(ディレクトリ内のleafツリー)ことが分かります.ファイルの 名前のみ調査に必要な場合は,それらをはっきりさせる必要はありません.こ れで検索スピードが飛躍的に増加します.

Option: -ignore_readdir_race

ディレクトリから読み込まれた名前のファイルが,findstat でファイルを調査する前に見つからない場合,エラーメッセージを出力しませ ん.このオプションを指定していない場合,エラーメッセージが出力されます. 頻繁に変更されるファイルシステム領域(メールのキュー,テンポラリ・ディレ クトリ等)を調査するシステムスクリプト(例えばcronスクリプト)では,このオ プションは役に立ち,その理由は,このような種類のディレクトリではよくあ ることだからです.findからのエラーメッセージを完全に無くすことは 望まないので,このオプションは,うまく問題を解決します.しかし,ファイ ルシステムの一部はこのオプションをオンにし,一部ではこのオプションをオ フにして検索する方法はありません.

Option: -noignore_readdir_race

このオプションは,`-ignore_readdir_race'オプションの効果を反転しま す.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.10 ファイルシステム

ファイルシステム(filesystem)とはディスクの区分のことで,それはロー カルホスト,または,ネットワーク経由のリモートホストからマウントしたも ののいずれかになります.ネットワークファイルシステムを検索すると遅くな るはずなので,通常,findはそれを避けます.

特定のファイルシステムの検索を避ける二つの方法があります.一つの方法は, findに一つのファイルシステムのみを検索するよう伝えることです.

Option: -xdev
Option: -mount

他のファイルシステムのディレクトリに下りません.これらのオプションは同 じです.

もう一つの方法は,それぞれのファイルがあるファイルシステムの形式を調査 し,好ましくないファイルシステムの形式にあるディレクトリに下らないよう にします.

Test: -fstype type

ファイルが,形式typeのファイルシステム上にある場合は真です.有効 なファイルシステム形式は,Unixの異なるバージョン間で異なります.いくつ かのバージョンのUnixなどが受け入れる,ファイルシステムの形式の不完全な リストは,以下のとおりです.

 
ext2 ext3 proc sysfs ufs 4.2 4.3 nfs tmp mfs S51K S52K

ファイルシステムの形式を知るために,`%F'指示語とともに `-printf'を使用することが可能です.`%D'指示語はデバイス番号を 表示します.See section ファイル情報の出力. リモートファイルシステムの 検索を避けるために,`-fstype'は通常,`-prune'とともに使用され ます.(see section ディレクトリ).


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.11 オペレータの主なものを組み合わせる

オペレータはテストとアクションから,複雑な表現を構築します.オペレータ は優先順位が下がる順序で,以下のものがあります.

( expr )

優先順位をあげます.exprが真の場合は真です.

! expr
-not expr

exprが偽の場合は真です.

expr1 expr2
expr1 -a expr2
expr1 -and expr2

And(論理積)です.expr1が偽の場合,expr2は評価されません.

expr1 -o expr2
expr1 -or expr2

Or(論理和)です.expr1が真の場合,expr2は評価されません.

expr1 , expr2

リストです.expr1expr2は,常に評価されます.expr2が 真の場合は真です.expr1の値は放棄されます.このオペレータで,一回 の処理で,他の処理が成功したかどうかに依存せず,複数の独立した処理を行 なうことができます.二つの処理expr1expr2は,常に完全に独 立というわけではなく,それはexpr1にファイルを編修したり削除したり する副作用がある可能性があり,また,expr2に影響する`-prune' を使用している可能性もあるためです.

findは,右から左まで式を評価しながら,それぞれのファイル名を起点 としたディレクトリツリーを,優先順位の規則に従い,(`-and'に対して は左が偽,`-or'に対しては真となる)結果が分かるまで検索し,そして, findは次のファイル名へ移動します.

複雑な表現で役に立つ,二つのテストが他にあります.

Test: -true

常に真です.

Test: -false

常に偽です.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on February, 24 2007 using texi2html 1.76.