定番コマンド 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 |
桂田 祐史