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を使った意味は特にないです