LOCATE(1)

名称
locate - ファイル名を高速に検索する

書式
locate [-Scims] [-l limit] [-d database] pattern ...

解説
locate はデータベースを使って全てのパスを検索し、 pattern にマッチしたファイル名を表示します。 データベースは定期的に(普通は週1回か毎日)再構築されます。 データベースの内容は、全ユーザがアクセスすることのできる 全てのファイル名です。

pattern にはシェルで使われるワイルドカード ( “*” “”? “\” “[” “”]) を使用することができます。 その場合、ワイルドカードをシェルに解釈されないように エスケープしなくてはいけません。 直前にバックスラッシュ (“\”) をつけると、いかなる文字も、 その文字が持つ特殊な意味が打ち消されます。 スラッシュ (“/”) も含め、いかなる文字も特殊な意味を 持ちません。

また、ワイルドカードを含まないパターン (“foo”) を 指定した場合、 locate は “*foo*” が指定されたものと解釈します。 歴史的な事情で、以前の locate は 32 から 127 までのキャラクタコード しか扱うことができませんでした。 現在の処理方法では改行 (‘\n’) とヌル (‘\0’) 以外のキャラクタ コードを処理できます。 これまでサポートされていたプレインASCIIのみで構成された ファイル名については、使用するメモリの量は増えていません。 32 未満、あるいは 127 をこえるキャラクタコードを含むファイル名 については、2 バイトを使って格納されます。 使用可能なオプションは以下のとおりです。

-S  データベースの統計を表示して終了します。

-c  通常の出力を行わず、マッチしたファイル名の数を表示します。

-d database
    デフォルトのデータベースを使わず、 database を使って検索します。 複数回 -d を指定することで、複数のデータベースを 使うことができます。 オプションの database はコロンで区切ることで複数のデータベースを使うことができます。 また、1つのコロンはデフォルトのデータベースを表します。 $ locate -d $HOME/lib/mydb: foo は “foo” をパターンとして、 最初に $HOME/lib/mydb を、次に /var/db/locate.database を検索します。 $ locate -d $HOME/lib/mydb::/cdrom/locate.database foo は、 “foo” をパターンとして $HOME/lib/mydb 、 /var/db/locate.database 、 /cdrom/locate.database の順番で検索します。 “ $ locate -d db1 -d db2 -d db3 pattern ” は “$ locate -d db1:db2:db3 pattern” や “$ locate -d db1:db2 -d db3 pattern” と同じです。 データベースの名前として - を指定した場合、標準入力から読み込みます。 例えば、次のようにデータベースを圧縮して使うことができます。 $ zcat database.gz | locate -d - pattern これは、高速な CPU 、少ない RAM 、遅い I/O を持つコンピュータを 使っている場合に便利です。 この場合、1つのパターンしか指定することができません。

-i  パターンとデータベースの間での大文字と小文字の違いを無視します。

-l number
    マッチしたファイル名の表示を、最大 number 個に制限します。

-m  stdio(3) ライブラリのかわりに mmap(2) ライブラリを使います。 これはデフォルトの動作です。ほとんどの場合で、高速に動作します。

-s  mmap(2) ライブラリのかわりに stdio(3) ライブラリを使います。

関連ファイル
/var/db/locate.database
    locate データベース
/usr/libexec/locate.updatedb
    locate データベースを更新するためのスクリプト
/etc/periodic/weekly/310.locate
    データベース再構築を起動するスクリプト

環境変数
LOCATE_PATH
    データベースのパスを指定します。空文字の場合は無効です。 -d オプションが指定された場合も無効になります。

関連項目
find(1), whereis(1), which(1), fnmatch(3), locate.updatedb(8) Woods, James A., 1983, Finding Files Fast, ;login, 8:1, pp. 8-10.

バグ
locate が実際には存在するファイルをリストアップできない場合や、 逆に、すでに削除されたはずのファイルをリストアップ してしまう場合があります。 これは locate が /etc/periodic/weekly/310.locate スクリプトで週に一度更新されるデータベースから 情報を得ているためです。 データベースの構築に find(1) を使うのは一時的な処置です。 locate データベースファイルの所有者は “nobody” となっています。 find(1) はユーザ名 “nobody” 、グループ名 “nobody” 、あるいはその他のユーザに対してリード属性がない ディレクトリを見付けた場合、 そのディレクトリの検索をスキップします。 例えば、ユーザのホームディレクトリに読み込み属性が なかったときは、そのユーザの全てのファイルはデータベースに 登録されません。 locate データベースの内容について、バイト順序の問題が解決されていません。 バイト順序が違うコンピュータ同士では、 データベースの共有ができません。 両方のアーキテクチャで int のサイズが同じ場合、 locate はホストのバイト順序、ネットワークのバイト順序の 違いに対応します。 そのため、FreeBSD/i386 (リトルエンディアン) 上で locate SunOS/sparc (ビッグエンディアン) 上で構築された データベースを使うことができます。

歴史
locate は 4.4BSD から登場しました。 FreeBSD 2.2 で、新たに多くの機能が付け加えられました。