プロジェクト内のファイルをいちいちfindしなくて済むようにlocateする

プロジェクトが大きくなるとfindが重くなるので、locate使いましょう。で、ちょっと困ったこともあるのでその話も。

まずupdatedbでファイル一覧のデータベースを作っておきます。

$ project=/path/to/project ; \
updatedb \
--output=${project}.db \
--require-visibility no \
--database-root=${project} \
--prunepaths="$(find ${project} -name .svn)"

出力は/path/to/project.dbにしてるけど別にどこでもいいです。
Subversion使ってるプロジェクトだと、各ディレクトリに.svnがあるので--prunepathsで全ての.svn以下を無視させてる。
chgrpされて一般ユーザーではエラーが出る場合があるけど、その場合は--require-visibility noしておくととりあえず動く。

このupdatedbを定期的にcronで回しておけば良い。


あとは実際に検索するだけ

$ locate --database=${project}.db '探したいファイル名(の一部でもいい)'

自分は正規表現で指定するのが好きなので

$ locate --database=${project}.db --regexp='探したいファイル名の正規表現'


で、困ったことなんだけど、updatedb (mlocate) 0.15

  • .svnそのものが残る

locateしたときに.svnディレクトリそのものが引っかかってしまう。
まぁこれは百歩譲って良いとして、

  • --prunepathに「-(ハイフン)」が入ってるディレクトリを指定しても無視されない!

これはかなり嫌。例えば--prunepathに/foo-bar/.svnを指定しても、/foo-bar/.svn/entriesなどがlocateで引っかかってしまう。

とりあえずlocateの検索結果をフィルタリングする方法で凌いでる。
誰か解決策知らないかなー?バージョン上げたらいいよ!とかパッチがあるよ!とかパッチ書くよ!とか大歓迎!
(ホントに気が向いたら自分でパッチ書くけど…)