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

5. ファイル名のデータベース

locateで使用されるファイル名のデータベースには,データベースが最 後に更新された時の,特定のディレクトリツリー内のファイルのリストが含ま れています.データベースのデフォルトファイル名は,locateupdatedbがコンフィグレーションされインストールされた時に決定され ます.データベースが更新される頻度と,項目に含めるディレクトリは, updatedbが実行される頻度と,その引数に依存します.

`locate --statistics'を使用することで,データベースの統計情報を得 ることが可能です.


5.1 データベースの位置

複数のファイル名のデータベースを存在させることが可能です.ユーザは, locateが検索を行なうデータベースを,LOCATE_PATH環境変数や コマンドラインオプションを使用して選択することが可能です.システム管理 者は,デフォルトのデータベースのファイル名,データベースを更新する頻度, そして,項目に含めるディレクトリを選択することが可能です.ファイル名の データベースは,updatedbプログラムで,通常夜に実行され更新されま す.

ネットワーク環境では,ファイルシステムの項目を含めながら,それぞれのルー トファイルシステムでデータベースを構築することに意味があります. updatedbは,ネットワークのスラッシングを避けるため,ファイルシス テムがローカルディスクにあるファイルサーバの,それぞれのファイルシステ ムで実行されます.updatedbに,それぞれのデータベースが含んでいる 項目のディレクトリを選択させるオプションは以下のとおりです.

updatedbのオプションの記述で,項目を含むデータベースがあるディレ クトリの指定は,See section updatedbの呼び出し.


5.2 データベースの書式

ファイル名のデータベースには,データベースが最後に更新された時の,特定 のディレクトリツリーのファイルのリストを含まれます.ファイル名のデータ ベースの書式変更は,異なるバイト順序を用いるマシンでも,データベースの 共有が可能となるように,GNU locateバージョン4.0から開始されまし た.新しいGNU locateは,新旧両方のデータベースの書式を読み込むこ とが可能です.しかし,古いバージョンのlocatefindでは, 新しい書式のデータベースを与えられた場合,間違った結果となります.

`locate --statistics'を実行した場合,要約された結果は,それぞれの locateのデータベースの形式を示します.


5.2.1 新しいデータベースの書式

updatedbは,4の要素を5にする(1)ことでデータベースの大きさが小さくなるように,ファイル名のリ ストを前部圧縮(front-compress)するため,frcodeを実行します. 前部圧縮(増分符合化としても知られている)は以下のように動作します.

データベースの項目は,(ユーザの利便性のため,大文字小文字を識別しないで) ソートされているリストです.リストはソートされているので,それぞれの項 目は,前の項目と同じ接頭辞(最初の文字列)を共有することがよくあります. それぞれのデータベース項目はオフセットバイトの差分の数で始まっていて, それは前の項目の更に前のものが使用している数より多くなる,前の項目に前 置される接頭辞への追加の文字数です.(数は負になることもあります.) それ 以降の数は,ヌルで終端されているASCII文字の残りです--共有している接尾 辞以降の名前の部分です.

オフセット差分数がバイト(+/-127)で保存できるものより大きい場合,バイト の値が0x80になり,それ以下の2バイトがその数値になっていて,それはハイバ イトを最初(ネットワークバイトの順序)にしたものを用います.

すべてのデータベースは,`LOCATE02'と呼ばれるダミーの項目で始まって いて,それは,データベースファイルの書式が正しいことを確認するために, locateが調査するものです.検索時にはその項目は無視されます.

最初の(ダミー)項目を,先頭のデータベース以外からすべて切り取っても,デー タベースを連結させることは不可能です.これは,二番目とそれ以降の最初の 項目にあるオフセット差分数が間違ってしまうためです.

`locate --statistics'の出力で,新しいデータベースの書式は `LOCATE02'として参照します.


5.2.2 サンプルデータベース

frcodeへのサンプル入力です.

 
/usr/src
/usr/src/cmd/aardvark.c
/usr/src/cmd/armadillo.c
/usr/tmp/zoo

共有するために前置される,最も長い接頭辞の長さは以下のようになります.

 
0 /usr/src
8 /cmd/aardvark.c
14 rmadillo.c
5 tmp/zoo

最後のヌルを改行に変更し,バイトを印字可能文字に変更した場合の, frcodeからの出力は以下のようになります.

 
0 LOCATE02
0 /usr/src
8 /cmd/aardvark.c
6 rmadillo.c
-9 tmp/zoo

(6 = 14 - 8,そして -9 = 5 - 14)


5.2.3 古いデータベースの書式

古いデータベースの書式は,Unixのlocatefindプログラム, そして早期のGNUがリリースしたもので使用されています.updatedbは, `--old-format'オプションが与えられた場合,この書式で生成します.

updatedbは,古い書式のデータベースを生成するために, bigramcodeと呼ばれるプログラムを実行します.古い書式は, 新しいものと以下の方式で異なります.オフセット差分数バイトで始まりヌル で終るそれぞれの項目の代わりに,-14から14までのオフセット差分数を示す0 から28の値になります.それ以上の大きなオフセット差分数を示すバイト値は, 0x1e (30)で0x80ではありません.大きな数は,ホストのバイト順でソートされ, それはネットワークバイトの順序である必要はなく,ホストのワード整数の大 きさとなっていて,それは通常4バイトです.その値が14より小さいものは表示 されません.データベースの行には終端バイトがありません.次の行の先頭は, 30より小さい値を持つバイトで示されます.

更に,最初のダミー項目で始まる代わりに,古いデータベース書式は,ファイ ルリストで最も一般的な128のbigramを含んでいる,256バイトの表で始 まります.bigramは調整されたバイトの組となっています.ハイビット セットを持つデータベースのバイトは,(ハイビットがクリアされてい る)bigram表内部の索引です.bigramとオフセット差分数の符合 化は,これらのデータベースを,新しい書式より20から25%まで小さくしますが, 8ビットクリーンにはなりません.特殊コードに使用される範囲にあるファイル 名のバイトは,データベース内では疑問符に置換され,それは,単一文字にマッ チするシェルのワイルドカードにはマッチしません.

そのため古い書式では,ASCII以外の文字の項目を忠実の保存することが不可能 です.そのため,国際化環境では使用すべきではありません.

`locate --statistics'の出力は,古い書式の改行やハイビット文字を含 むファイル名の計数で間違えてしまうでしょう.


5.3 改行の取り扱い

データベースでは,ファイル名はヌル文字で終端されています.これは,古い 書式も新しい書式も同じようになっています.

新しいデータベースの書式が使用されているとき,frcodeに渡す前の, ファイルのリストの並べ替え能力に依存する圧縮技術が,データベースの生成 に使用されています.

システムのソートコマンドが,入力されるファイルのリストを`-z'オプショ ンでヌル文字で分離している場合,このオプションが使用され,そのため, updatedblocateは両方共,改行を含むファイル名を正しく処 理します.sortコマンドにこのサポートが無い場合,ファイルのリスト は改行文字で分離され,つまり,改行を含むファイルの部分は間違って並べ替 えられます.結果として,正しくないマッチと,正しくない間違ったマッチの 両方が発生します.

一方,古いデータベース書式を使用している場合,改行が埋め込まれたファイ ル名は正しく処理されません.これを強制する技術的な制限は無いので, bigramプログラムはヌルで分離されているファイル名のリストをサポー トするように更新されていません.

そのため,新しいデータベース書式を使用していて(これはデフォルトです), システムでGNU findを使用している場合,改行はいつでも正しく処理さ れます.そうでなければ,改行は正しく処理されない可能性があります.


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

This document was generated by Akihiro Sagawa on September, 28 2005 using texi2html 1.70.