AWSでファイルを探す時は、もっぱらfindを使ってました。しかしlocateの方がdb参照するので早いようですね!
sudo find / -name hoge
ちょっと使ってみましょう。
AWS の初期 EC2環境に locateは入っていない
EC2の初期環境でlocateを使ってもコマンドがないと言われます。
まずはyumでインストールしましょう。slocateやlocateがありません。
sudo find -name "*locate*"
locate のインストール
AWS上はmlocateをインストールします。
sudo yum install mlocate
locate の検索ロジック
ようは、バークレイDBを参照しているので早いわけです。findだとファイルを検索なので、インデックスと言い換えてもいいでしょう。updatedbは、ここにあります。
/usr/bin/updatedb
更新はsu権限で実行します。
sudo updatedb
locateを使う
単純です。
locate hoge
さすがインデックス、findより高速です。やっていることはfindと等価です。
find / "*hoge*"
locateは、sudoがないとユーザーがアクセス可能なファイルだけが検索結果に出るのでいいですね。findはエラーが出過ぎでつらかったので。
updatedbの更新
crontabで実行されています。
cat /etc/cron.daily/mlocate.cron
#!/bin/sh
nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }')
renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"
updatedbの対象
ここでデフォルトしています。
$ cat /etc/updatedb.conf PRUNE_BIND_MOUNTS = "yes" PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs" PRUNENAMES = ".git .hg .svn" PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
- PRUNEFSは、 updatedbに含めないファイル名
- PRUNENAMESは、 updatedbに含めない拡張子
- PRUNEPATHSは、 updatedbに含めないパス
まとめ
locateいいね。あとパスが通っているファイル = コマンドを探すならwhichが好きです。
which locate