プロジェクトが大きくなると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の検索結果をフィルタリングする方法で凌いでる。
誰か解決策知らないかなー?バージョン上げたらいいよ!とかパッチがあるよ!とかパッチ書くよ!とか大歓迎!
(ホントに気が向いたら自分でパッチ書くけど…)