tech.guitarrapc.cóm

Technical updates

AWS Linux で locateコマンドを使う

AWSでファイルを探す時は、もっぱら find を使ってました。
sudo find / -name hoge
しかしlocateの方がdb参照するので早いようですね! ちょっと使ってみましょう。

AWS の初期 EC2環境に locateは入っていない

EC2の初期環境でlocateを使ってもコマンドがないと言われます。 まずは、yumでインストールしましょう。 slocateもlocateもありませんね。
sudo find -name "*locate*"

locate のインストール

AWS 上は、 mlocate でyum installします。
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の対象

ここで既定しています。
/etc/updatedb.conf
内容を見ます。
vim /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"
  1. PRUNEFS は、 updatedb に含めないファイル名です。
  2. PRUNENAMES は、 updatedb に含めない拡張子です。
  3. PRUNEPATHS は、 updatedb に含めないパスです。

まとめ

locateいいね! あとパスが通っているファイル = コマンドを探すならwhichが好きかも。
which locate
とかね!