1. ファイル名検索
locate [-Scims] [-l limit] [-d database] pattern ...
の形式で、ファイル名を検索します。
「高速検索」と銘打っているだけに、ものすごく速い。
「find」で、ディレクトリを指定するより速い。
実行ファイルを探す「whereis」よりも速い。
なんで早いかっちゅうと、ファイル名のデータベースを持っているからです。
どうも定期的(週一回か毎日らしい)に、データベースの更新を行っているのですな。
意識したことがないので、「cron」で実行しているのでしょう。
「FreeBSD」の場合
/var/db/etcupdate/current/etc/periodic/weekly/310.locate
に、その記述があったので、毎週やっているようです。
なので、たまにしか起動しないマシンで実行すると。
$ locate wmhelper.h
locate: database too small: /var/db/locate.database
Run /usr/libexec/locate.updatedb
怒られちゃいます。
2. データベース作成 FreeBSD
「FreeBSD」の場合、
/var/db/locate.database ← データベース
/usr/libexec/locate.updatedb ← 更新スクリプト
という構成になっています。
データベースが存在しない場合、更新スクリプトを実行するのですが。
「root」ユーザで実行しようとすると
$ /usr/libexec/locate.updatedb
>>> WARNING
>>> Executing updatedb as root. This WILL reveal all filenames
>>> on your machine to all login users, which is a security risk.
てな感じで怒られちゃいます。
権限が「nobody:wheel」という特殊なものなので、root ユーザで実行しちゃ警告が表示されるのですが、かと言ってログインユーザで行うと、
$ /usr/libexec/locate.updatedb
/usr/libexec/locate.updatedb: cannot create /var/db/locate.database: Permission denied
とエラーになるので、「root」権限で行うしかないようですな。
こ、これが、「FreeBSD 14.0 RELEASE」で解決しました。
インストールしたばかりのマシンで、「locate」コマンドを実行したら・・・。
$ ocate winter
locate: the locate database '/var/db/locate.database' is smaller than 256 bytes large.
To create a new database, please run the following command as root:
/etc/periodic/weekly/310.locate
をを、「cron」で動かすスクリプトを、「root」権限で実行するのが正解のようです。
「root」ユーザ権限で。
$ /etc/periodic/weekly/310.locate
Rebuilding locate database:
エラーもワーニングも出力されませんでした。
3. データベース作成 Linux
「Linux」の場合(2019年12月25日現在、ArcoLinux 19.12.15 でしかやったことがない)、
/var/lib/mlocate/mlocate.db ← データベース
/usr/bin/updatedb ← 更新スクリプト
という構成になっています。
こちらの場合は、「root」ユーザで実行しても、なんら警告は表示されませんでした。
4. 注意
検索する場合、「検索後」を「*検索後*」と、両端をワイルドカードで囲んだような形式で検索するので、短い名前で探すと候補が多くなりすぎて、混乱しちゃうのでご注意ください。