web-dev-qa-db-ja.com

`updatedb`と` locate`はどのようなデータベースを使用しますか?

locatefindutilsプログラムは、ファイル名の1つ以上のデータベースをスキャンし、一致するものを表示します。最後のファイル名データベースの更新中にファイルが存在した場合、これは非常に高速なfindコマンドとして使用できます。

今日では多くの種類のデータベースがあり、

では、updatedbはどのようなデータベースを更新し、locateを使用しますか?

ありがとう。

25
Tim

locate/updatedbの実装では、一般的に、一般的なデータベースエンジンではなく、要件に合わせて調整された特定のデータベースを使用します。これらの特定のデータベースは、各実装ごとに文書化されています。例えば:

  • GNU findutils ’は locatedb(5) に記載されており、ファイルのリストにすぎません(特定の圧縮アルゴリズムを使用)。
  • mlocatemlocate.db(5) に記載されており、ディレクトリとファイル(メタデータ付き)のリストと見なすこともできます。
29
Stephen Kitt

C構造体のフラットファイルのようで、Gnu LibCを使用して書き込み/読み取り OBSTACKSマクロ

ソースを見る

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L72

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L41

あなたはと同じようなものを得ることができます

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
13
jmullee

私が知っている限りでは Berkeley DB これはキー/値のデーモンレスデータベースです。詳細については、リンクをクリックしてください。ウィキペディアからの抜粋:

Berkeley DB(BDB)は、キー/値データ用の高性能組み込みデータベースを提供することを目的としたソフトウェアライブラリです。 Berkeley DBはCで記述されており、C++、C#、Java、Perl、PHP、Python、Ruby、Smalltalk、Tcl、およびその他の多くのプログラミング言語用のAPIバインディングがあります。 BDBは、任意のキーとデータのペアをバイト配列として格納し、1つのキーに対して複数のデータアイテムをサポートします。 Berkeley DBはリレーショナルデータベースではありません。

RHEL/CentOSでのデータベースの場所は/var/lib/mlocate/mlocate.db(他のディストリビューションについては不明)。コマンド locate --statisticsはデータベースの場所といくつかの統計についての情報を提供します(例):

Database /var/lib/mlocate/mlocate.db:
        16,375 directories
        242,457 files
        11,280,301 bytes in file names
        4,526,116 bytes used to store database

Mlocate形式の場合、ここにmanページの先頭があります。

Mlocateデータベースはファイルヘッダーで始まります。マジックナンバー(Cリテラルのような「\ 0mlocate」)は8バイト、ビッグエンディアンの構成ブロックサイズは4バイト、ファイルフォーマットバージョン(0)は1バイト、1 「可視性が必要」フラグのバイト(0または1)、2バイトのパディング、およびデータベースのルートのNUL終了パス名。

ヘッダーの後に構成ブロックが続きます。これは、構成の変更が内容に影響を与える可能性がある場合にデータベースが再利用されないようにするために含まれています。バイト単位の構成ブロックのサイズは、ファイルヘッダーに格納されます。構成ブロックは、変数名で並べられた一連の変数割り当てです。各変数の割り当ては、NULで終了する変数名とNULで終了する値の順序付きリストで構成されます。値リストは、もう1つのNUL文字で終了します。使用される順序は、strcmp()関数によって定義されます。

2
Romeo Ninov