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

2. ファイル検索

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

2.1 名前  
2.2 リンク  
2.3 時間  
2.4 サイズ  
2.5 形式  
2.6 所有者  
2.7 許可  
2.8 内容  
2.9 ディレクトリ  
2.10 ファイルシステム  
2.11 オペレーターの主なものを組み合わせる  


2.1 名前

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

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

2.1.1 ベース名のパターン  
2.1.2 完全なファイル名のパターン  
2.1.3 すばやい完全な名前の検索  
2.1.4 シェルパターンマッチング  Wildcards used by these programs.


2.1.1 ベース名のパターン

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

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


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

Test: -path pattern
Test: -ipath pattern
見つかったファイルで,コマンドライン引数で始まるファイル名全体がシェルパ ターンpatternに一致する場合は真です.`-ipath'の場合は,大文字 小文字を区別しません.ディレクトリツリー全体を無視するために,ツリーの全 てのファイルを調査するのではなく,`-prune'を使用してください.

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


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

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

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

以下のコマンドは,

 
locate pattern

こちらとほとんど等価です.

 
find directories -name pattern

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

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

ここに,locateが検索するファイル名データベースを選択する方法があ ります.デフォルトはシステムに依存します.

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


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

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

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

*
ゼロ以上の文字に一致します.

?
あらゆる一文字に一致します.

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

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

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

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


2.2 リンク

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

2.2.1 シンボリックリンク  
2.2.2 ハードリンク  


2.2.1 シンボリックリンク

Test: -lname pattern
Test: -ilname pattern
ファイルがシェルパターンpatternに一致する内容のシンボリックリンク の場合は真です.`-ilname'の場合は,大文字小文字を区別しない一致です. pattern引数の詳細は,See section 2.1.4 シェルパターンマッチング.そして,現在の ディレクトリとそのサブディレクトリ内の,`sysdep.c'へのあらゆるシン ボリックリンクをリストアップするために,以下のようにして行なうことができ ます.

 
find . -lname '*sysdep.c'

Option: -follow
シンボリックリンクと異なります.このオプションを与えた時の動作には,以下 の違いがあります.


2.2.2 ハードリンク

ハードリンクを探すため,最初に見つけたいファイルにリンクしているファイル のinodeナンバーを取得します.`ls -i'や`find -ls'を実行すること で,ファイルのinodeナンバーとそれへのリンクの数を知ることが可能です.ファ イルに1つ以上のリンクがある場合,そのinodeナンバーを`-inum'に渡すこ とで,他のリンクを検索することが可能です.多くのシステムの`/usr'の ように,他のファイルシステムをマウントしているディレクトリを起点に検索を 開始している場合は,`-xdev'オプションを加えて下さい.ファイルへのハー ドリンクは同じファイルシステムに存在する必要があるので,これを行なうこと で不要な検索を防ぎます.See section 2.10 ファイルシステム.

Test: -inum n
ファイルがinodeナンバーnを持つかどうかの調査.

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

Test: -links n
ファイルがn個のハードリンクを持つかどうかの調査.


2.3 時間

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

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

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

2.3.1 期間の範囲  
2.3.2 タイムスタンプの比較  


2.3.1 期間の範囲

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

Test: -atime n
Test: -ctime n
Test: -mtime n
ファイルの最後のアクセス(またはステータスの変更,または編集)が, n*24時間前の場合は真です.

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

 
find /u/bill -amin +2 -amin -6

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

 
find ~ -daystart -type f -mtime 1


2.3.2 タイムスタンプの比較

タイムスタンプを現在の時間と比較する代わりに,それを他のファイルのタイム スタンプと比較することが可能です.そのファイルのタイムスタンプは,いくつ かのイベントによって,他のプログラムによって更新されるかもしれません.ま た,touchコマンドを使用して,特定の固定した日付に設定することもで きるでしょう.例えば,今年の1月1日移行に編集された`/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日後の場合は真です.使用されておらず,ディスクスペースを確保する ために圧縮または削除されたファイルを探すのに役立ちます.


2.4 サイズ

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

b
512バイトブロック単位
c
バイト単位
k
キロバイト(1024バイト)単位
w
2バイトワード単位

サイズは間接的なブロックを数えませんが,実際には割り当てられていない疎ら なファイル内のブロックは数えます.

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


2.5 形式

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

b
(バッファされる)ブロックスペシャルファイル
c
(バッファされない)ブロックスペシャルファイル
d
ディレクトリ
p
名前付きパイプ(FIFO)
f
通常のファイル
l
シンボリックリンク
s
ソケット

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


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プログラムを使用して,既存の ユーザとグループに変更したほうが良いでしょう.


2.7 許可

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

Test: -perm mode
ファイルの許可が正確にmode(数値的でも象徴的でも可能です)と同一の場 合は真です.象徴的なモードは,0を起点として使用します.modeが `-'で始まっている場合,modeの許可がすべてファイルに設 定されている場合は真です.modeに設定されていない許可は無視されます. modeが`+'で始まっている場合,modeの許可がひとつで もファイルに設定されている場合は真です.modeに設定されていない許 可は無視されます.


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のマニュアルページを参照して下さい.


2.9 ディレクトリ

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

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

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

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

Action: -prune
`-depth'が与えられていない場合は真です,現在のディレクトリから下り ません.`-depth'が与えられている場合は,偽です.効果はありません. `-prune'は,その式の前ではなく,後にあるテストとアクションにのみ効 果があります.

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

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

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


2.10 ファイルシステム

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

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

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

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

Test: -fstype type
ファイルが,形式typeのファイルシステム上にある場合は真です.有効な ファイルシステム形式は,Unixの異なるバージョン間で異なります.いくつかの バージョンのUnixなどが受け入れる,ファイルシステムの形式の不完全なリスト は,以下のとおりです.
 
ufs 4.2 4.3 nfs tmp mfs S51K S52K
ファイルシステムの形式を知るために,`%F'指示語とともに `-printf'を使用することが可能です.See section 3.2 ファイル情報の出力.リ モートファイルシステムの検索を避けるために,`-fstype'は通常, `-prune'とともに使用されます.(see section 2.9 ディレクトリ).


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の値は放棄されます.このオペレータで,一回 の処理で,他の処理が成功したかどうかに依存せず,複数の独立した処理を行な うことができます.

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

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

Test: -true
常に真です.

Test: -false
常に偽です.


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

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html