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