設定ファイルの名前は覚えてるのに、どこにあるか分からんfind / -name ファイル名 で探したら時間がかかりすぎた
【疑問】find / で探したら遅すぎる。locate と updatedb、/etc/updatedb.conf、whereis・which・type【LPICレベル1】
前提のおさらい。設定は /etc、プログラムは /usr/bin、変わるデータは /var と、置き場所は FHS で決まってる。find はその場でディレクトリを1つずつたどるから、/ から探すと遅い
>>1locate を使う。前もって作っておいたファイル名のデータベースから探すから速い。データベースを作り直すのが updatedb
>>3
手元の Debian では plocate というパッケージで、locate は plocate への別名(update-alternatives で登録されてる)。データベースは /var/lib/plocate/plocate.db。ほかの実装に mlocate や古い slocate もあって、ディストリビューションで入ってるものが違う
>>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 で正規表現
>>5
そのあと作ったファイルが locate で出てこん
>>6
データベースに入ってるのは、updatedb を動かしたときにあったものだけ。new.txt を作ってすぐ探したら見つからず終了ステータス1、updatedb し直したら出た。消したファイルも、次の updatedb までは名前だけ残る
>>7
updatedb はいつ動いてるん?
>>8
Debian の plocate では systemd のタイマー plocate-updatedb.timer(OnCalendar=daily)で毎日。systemd がない環境のために /etc/cron.daily/plocate も入ってて、タイマーが使えるときは何もせずに終わる作りになってた。ディストリビューションによっては cron.daily だけ
>>3
探さない場所は決められるん?
>>10/etc/updatedb.conf に 変数="値" の形で書くPRUNEPATHS 探さないパス(Debian の既定は /tmp /var/spool /media など)PRUNEFS 探さないファイルシステムの種類(proc sysfs tmpfs nfs など)PRUNENAMES 探さないディレクトリ名(.git など)PRUNE_BIND_MOUNTS バインドマウントを飛ばすか
>>11-n .git で PRUNENAMES に足して作ったら、.git の中の config は出えへんかった。updatedb.conf の man によると、除外したディレクトリそのものの名前はデータベースに入る
>>2
whereis は何を探すん?
>>13
プログラム・ソース・マニュアルを、決まった場所の一覧から探す。PATH は使わないwhereis passwd → passwd: /usr/bin/passwd /etc/passwd-b 実行ファイルだけ、-m マニュアルだけ、-s ソースだけ
>>14
この環境は man ページを入れてない作りやから whereis -m ls は空やった。man が入った普通の環境なら /usr/share/man/man1/ls.1.gz も出る
>>14
which と type との違いは?
>>16
which は PATH の中の実行ファイルだけ、type は alias や組み込みコマンドも見る。type -a ls は alias と /usr/bin/ls と /bin/ls を出した(/bin が /usr/bin へのリンクで、PATH に両方あるから)
>>3
名前で速く探すのは locate、条件で探すのは find、コマンドの場所は which と type、マニュアルまでまとめて見るのは whereis、で分けるわ
管理人のひとこと
- locate はファイル名のデータベースから探すので速いが、データベースは updatedb を動かした時点のもの。新しいファイルは次の updatedb まで出てこない。
-i大文字小文字を区別しない、-c件数、-bファイル名の部分だけ、-r正規表現。 - updatedb は cron.daily や systemd のタイマーで毎日動くのがふつう。探さない場所は /etc/updatedb.conf の PRUNEPATHS(パス)・PRUNEFS(ファイルシステムの種類)・PRUNENAMES(ディレクトリ名)・PRUNE_BIND_MOUNTS。
- 実装は plocate・mlocate など、ディストリビューションで違う(Debian 13 は plocate で、locate はその別名)。
- whereis は決まった場所からプログラム(
-b)・マニュアル(-m)・ソース(-s)を探す。which は PATH の中の実行ファイル、type は alias・組み込みまで含めて正体を示す。