ファイルを探す[findとlocate]

More than 3 years have passed since last update.

Linux(我が家の環境ではUbuntu12.04)でファイルをサクっと検索したい場合に何を使うか

長らく自分はfindを使っていたが、どうもlocateの方が高速だし手軽らしいという話を聞きつけた。


なんとなく調べてみた感じ


find


  • 検索オプションが豊富

  • だから色々柔軟に検索できる(しやすい)

  • 遅い


locate



  • findに比べて検索オプションが貧弱(調べ不足?)

  • 速い


遅いとか速いとかどうしてなの



  • findではその場でストレージにアクセスし検索する

  • 対してlocateでは事前に作成したデータベースを元に検索する


つまり



  • findは新しいファイルに即座に対応できる


  • locateは新しいファイルに対応できない代わりに検索が高速


動作

find / -name '*hoge*'

locate hoge


  • これで同じ動作。locate使ったほうが入力も楽だしよくね、っていう


  • findでは検索する場所を指定している(第1引数/)のに対してlocateでは指定していない


  • locateではデフォルトで/から検索する


  • locateを用いて/以外から検索したい場合については後述


検索するデータベースってどのタイミングで作られるの



  • /etc/cron.daily/mlocateで作られている

  • cron.dailyなので実行タイミングに起動してないと作成されない


  • /etc/crontabを確認し実行タイミングを見ておく

  • 手動でやりたければ# updatedbする


/以外から検索したいとき


データベースを作る


  • 検索したい場所のデータベースを別個で作る

# updatedb -U /hoge/ -o /path/to/database.db

これで/hoge/のデータベースが/path/to/databse.dbとして作成される。

ちなみに標準のデータベースは/var/lib/mlocate/mlocate.dbにある

* updatedbはスーパーユーザ権限で実行する必要がある。#でなく$で実行するとこんな感じ

$ updatedb -U ~/ -o ~/hoge.db

updatedb: can not change group of file `/home/tea/hoge.db.9XvzA2' to `mlocate': Operation not permitted


  • 使用するデータベースを変更してlocateする

$ locate -d /path/to/database.db hoge

-dオプションでデータベースを指定するだけ


めんどくさいんだけど…



  • locateの結果をgrepでもすればいいじゃない

$ locate hoge | grep '/home/hogehoge/'


まとめ


  • 頻繁にファイルが増えたり消えたりする場合にはfindを使ったほうが良い

  • あんま変動しないとこならlocate

  • ただしデフォルトでは常に/から検索されるので注意(無駄も含まれる)

  • データベースを別個に作成してもいいけどパイプでgrepとかに渡してやれば簡単


追記



  • findだと権限持ってないところを検索できない

$ find /etc/webmin -name '*webmin*'

/etc/webmin
find: `/etc/webmin/dovecot': 許可がありません
find: `/etc/webmin/fsdump'
: 許可がありません
find: `/etc/webmin/openslp': 許可がありません
以下略



  • locateだと権限持ってないユーザで実行しても検索できる

$ locate webmin | grep /etc/webmin

/etc/webmin
/etc/webmin/acl
/etc/webmin/adsl-client
以下略


  • Webminを使った意味は特にないです