読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】find / で探したら遅すぎる。locate と updatedb、/etc/updatedb.conf、whereis・which・type【LPICレベル1】

18レスカテゴリ:Linux
1: 名無しさん

設定ファイルの名前は覚えてるのに、どこにあるか分からん
find / -name ファイル名 で探したら時間がかかりすぎた

2: 名無しさん

前提のおさらい。設定は /etc、プログラムは /usr/bin、変わるデータは /var と、置き場所は FHS で決まってる。find はその場でディレクトリを1つずつたどるから、/ から探すと遅い

3: 名無しさん

>>1
locate を使う。前もって作っておいたファイル名のデータベースから探すから速い。データベースを作り直すのが updatedb

4: 名無しさん

>>3
手元の Debian では plocate というパッケージで、locate は plocate への別名(update-alternatives で登録されてる)。データベースは /var/lib/plocate/plocate.db。ほかの実装に mlocate や古い slocate もあって、ディストリビューションで入ってるものが違う

5: 名無しさん

>>3
自分用のデータベースを作って試した(updatedb -l 0 -o db -U src で src の下だけを db に入れて、locate -d db で読ませる)
locate -d db report → /home/user/src/docs/report.txt
-i で大文字小文字を区別しない → Report2.TXT も出た
-c txt → 件数だけ(2)
-b notes → パスの最後のファイル名の部分だけで探す
-r で正規表現

6: 名無しさん

>>5
そのあと作ったファイルが locate で出てこん

7: 名無しさん

>>6
データベースに入ってるのは、updatedb を動かしたときにあったものだけ。new.txt を作ってすぐ探したら見つからず終了ステータス1、updatedb し直したら出た。消したファイルも、次の updatedb までは名前だけ残る

8: 名無しさん

>>7
updatedb はいつ動いてるん?

9: 名無しさん

>>8
Debian の plocate では systemd のタイマー plocate-updatedb.timer(OnCalendar=daily)で毎日。systemd がない環境のために /etc/cron.daily/plocate も入ってて、タイマーが使えるときは何もせずに終わる作りになってた。ディストリビューションによっては cron.daily だけ

10: 名無しさん

>>3
探さない場所は決められるん?

11: 名無しさん

>>10
/etc/updatedb.conf に 変数="値" の形で書く
PRUNEPATHS 探さないパス(Debian の既定は /tmp /var/spool /media など)
PRUNEFS 探さないファイルシステムの種類(proc sysfs tmpfs nfs など)
PRUNENAMES 探さないディレクトリ名(.git など)
PRUNE_BIND_MOUNTS バインドマウントを飛ばすか

12: 名無しさん

>>11
-n .git で PRUNENAMES に足して作ったら、.git の中の config は出えへんかった。updatedb.conf の man によると、除外したディレクトリそのものの名前はデータベースに入る

13: 名無しさん

>>2
whereis は何を探すん?

14: 名無しさん

>>13
プログラム・ソース・マニュアルを、決まった場所の一覧から探す。PATH は使わない
whereis passwd → passwd: /usr/bin/passwd /etc/passwd
-b 実行ファイルだけ、-m マニュアルだけ、-s ソースだけ

15: 名無しさん

>>14
この環境は man ページを入れてない作りやから whereis -m ls は空やった。man が入った普通の環境なら /usr/share/man/man1/ls.1.gz も出る

16: 名無しさん

>>14
which と type との違いは?

17: 名無しさん

>>16
which は PATH の中の実行ファイルだけ、type は alias や組み込みコマンドも見る。type -a ls は alias と /usr/bin/ls と /bin/ls を出した(/bin が /usr/bin へのリンクで、PATH に両方あるから)

18: 名無しさん

>>3
名前で速く探すのは locate、条件で探すのは find、コマンドの場所は which と type、マニュアルまでまとめて見るのは whereis、で分けるわ

管理人のひとこと