3 locate と向き合う (自分のファイルの検索)

定番コマンド locate は、 /var/db/locate.database というインデックス・ファイルを参照して、 ファイルを高速に検索する。

Mac ではデータベースを作るには、一度
  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
としておけ、と言われている。

手動でインデックス・ファイルを更新するには、 /usr/libexec/locate.updatedb を実行することでなされる。 設定は /etc/locate.rc というファイルに記述する。

実は良く分からないところがあった。 パーミッションが 700 である自分のディレクトリィの下は検索しないようだ。 /usr/libexec/locate.updatedb を読むと、 id のチェックとかしていて、ルートで実行すると、 nobody がアクセスできるものしか検索していないみたいだ (真面目に読んでないので間違っているかも -- でも考えてみると、もっともな動作ですね。 マルチユーザーで使っているときに、 ``裏帳簿.xlsx'' みたいなファイル名が他人に分かるのは嫌だ)。


そうすると、自分のファイルを検索したければ、 用意は自分でやれっていうことなのかな (まあ、妥当かも)。


当てずっぽうで次のようにした。 システムの設定ファイル /etc/locate.rc を ホームディレクトリィにコピーして、 ホームディレクトリィの下しか検索しないように書き換える (SEARCHPATHS="/Users/mk")。 当然データベース・ファイルも個人所有のものにする (FCODES="/Users/mk/locate.database")。

cp -p /etc/locate.rc ~
vi ~/locate.rc
% diff /etc/locate.rc ~/locate.rc
13c13
< #FCODES="/var/db/locate.database"
---
> FCODES="/Users/mk/locate.database"
16c16
< #SEARCHPATHS="/"
---
> SEARCHPATHS="/Users/mk"
%

環境変数 LOCATE_CONFIG で、設定ファイルを指定して、 /usr/libexec/locate.updatedb を実行する。
setenv LOCATE_CONFIG ~/locate.rc
    (bash 使っているならば export LOCATE_CONFIG=~/locate.rc)
/usr/libexec/locate.updatedb

無事 ~/locate.database が出来た。

このデータベース・ファイルを用いて検索するには、 -d オプションで指定すれば良い。

locate -d ~/locate.database 検索パターン
出来た、出来た。


エイリアスでも作っておくか。
tcsh 用のエイリアス
alias   mylocate        'locate -d ~/locate.database \!*'
あるいはシステムのファイルも、自分のファイルも同時に検索してしまえ、 ということであれば、次のようにする。
alias   locate          '/usr/bin/locate -d ~/locate.database:/var/db/locate.database \!*'

あとは、データベースの更新を自動でやるように設定すれば出来上がり。

daily
#!/bin/sh
export LOCATE_CONFIG="/Users/mk/locate.rc"
/usr/libexec/locate.updatedb
のようなスクリプトを作っておいて、 crontab で登録した。

桂田 祐史
2018-11-04