locate コマンドは、コマンドの実行時にファイルを検索するのではなく 事前に作成したデータベースを使って検索するので、find コマンドよりも高速で検索することができます。
$ locate cgi (省略) /usr/share/doc/popularity-contest/examples/popcon-submit.cgi /usr/share/doc/python-pexpect/examples/cgishell.cgi.gz /var/lib/nginx/fastcgi /var/lib/nginx/scgi
パターンマッチングも色々できます。
$ locate "*.cgi" /usr/lib/w3m/cgi-bin/dirlist.cgi /usr/lib/w3m/cgi-bin/multipart.cgi /usr/lib/w3m/cgi-bin/w3mhelp.cgi /usr/lib/w3m/cgi-bin/w3mmail.cgi /usr/lib/w3m/cgi-bin/w3mman2html.cgi /usr/share/doc/popularity-contest/examples/popcon-submit.cgi
検索にデータベースを使うので、作ったばかりのファイルを検索することはできません。
$ touch /var/www/test.cgi $ locate test.cgi
データベースを更新するには updatedb コマンドを使います。
$ sudo updatedb
これで出てきます。
$ locate test.cgi
/var/www/test.cgi
データベースの更新は だいたい cron で毎日動くようになっています。 Ubuntu の場合は /etc/cron.daily にあります。
$ ls -l /etc/cron.daily/mlocate
-rwxr-xr-x 1 root root 606 2010-03-24 19:16 /etc/cron.daily/mlocate
注意しなくてはいけないのは /tmp や /var/spool などは除外の設定がされてたりして 検索しても出てこない場合があります。
Ubuntu の場合 /etc/updatedb.conf に設定されています。
$ cat /etc/updatedb.conf
PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs ecryptfs fusesmb devtmpfs"