Linuxコマンド locate(ファイル名データベースに基いてファイルを検索する)

あらかじめ作成されたファイル名データベースに基づいて、指定したキーワードでファイルを検索するコマンドを解説

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

概要・使用方法

updatedbで作成されたデータベースを読み込み、与えられたパターンを含むファイル名を1行ずつ出力します。パターンに指定した文字列は展開文字列になります。findコマンドよりも高速に検索することができます。

ファイル名データベースは通常、自動的に定期更新されますがupdatedbコマンドで明示的に作成・更新できます。実行したホストでアクセスできるファイルはすべてlocateデータベースの検索対象にできますが、/tmp/や/var/logなど、比較的保持する必要性が低いと判断されるディレクトリを避けることもできます。updatedbコマンドは管理者権限で実行する必要がある。

書式

$ locate [オプション] パターン

オプション

-d データベース名,
–database データベースファイル名
ファイル名データベースの代わりにディレクトリを指定する
(デフォルトは環境変数LOCATE_PATHから検索する)
-c,
–count
マッチするエントリ数のみを出力する
-i,
–ignore-case
大文字/小文字を区別しない
-O,
–null
行末にNULL文字を付加する
-r 正規表現,
–regexp 正規表現
正規表現にマッチするエントリを出力する
オプション一覧表

updatedb.confファイル

updatedbは/etc/updatedb.confに設定したPRUNEFS(対象外ファイルシステム)、PRUNENAMES(対象外ファイル名)、PRUNEPATH(対象外パス)を指定すると不要なファイルやディレクトリを検索対象外することができる。

[centos@xxx ~]$ 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 fuse.sshfs fusectl gfs gfs2 gpfs 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 fuse.glusterfs ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"
[centos@xxx ~]$ 

サンプル

$ locate "chmod"

実行結果

[centos@xxx ~]$ locate "chmod"
/usr/bin/chmod
/usr/share/man/man1/chmod.1.gz
[centos@xxx ~]$ 

正規表現でマッチしたリストを出力する

サンプル

$ locate -r /sbin/mkfs.*fs$

実行結果

[centos@xxx ~]$ locate -r /sbin/mkfs.*fs$
/usr/sbin/mkfs.btrfs
/usr/sbin/mkfs.cramfs
/usr/sbin/mkfs.xfs
[centos@xxx ~]$ 

マッチしたエントリ数を出力する

サンプル

$ locate -c /sbin/mkfs.*fs

実行結果

[centos@xxx ~]$ locate -c /sbin/mkfs.*fs
3
[centos@xxx ~]$ 

ファイル名データベースを作成する

updatedbは、cronスクリプトがパッケージに用意されており毎日起動するように設定されています。このデータベースが一定期間更新されていない場合は、情報が古くなり期待通りの結果が出ない可能性があります。その場合は、手動実行するか定期実行するように設定するようにしよう。

サンプル

$ updatedb

サンプル:ログファイルなどをファイル名データベースに含めない場合

$ updatedb --prunepaths=/var/log

locateコマンドが見つからない場合

centosでlocateコマンドがインストールされていない場合があるので、yumでインストールしよう。

[centos@xxx ~]$ locate
-bash: locate: command not found    #コマンドが存在しない

[centos@xxx ~]$ yum install mlocate
[centos@xxx ~]$ locate "ls"
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory 

インストール直後は、ファイル名データベース(mlocate.db)が作成されていないため、上記のようなエラーが発生する。updatedbコマンドでファイル名データベースを作成する必要がある。

updatedbコマンドは、管理者権限で実行する必要があるので、sudoコマンドで実行するかroot権限で実行する必要がある。

[root@xxx ~]$ updatedb
[centos@xxx ~]$ locate "configure"
/etc/systemd/system/multi-user.target.wants/rhel-configure.service
/opt/atlassian/confluence/admin/configurecaptcha.vm
/opt/atlassian/confluence/admin/configurelanguage.vm
/opt/atlassian/confluence/admin/configurelog4j.vm
/opt/atlassian/confluence/admin/configurelogo.vm
/opt/atlassian/confluence/admin/configuremobileapps.vm
/opt/atlassian/confluence/admin/help/configurecaptcha.vm
/opt/atlassian/confluence/admin/help/configurelanguage.vm
/opt/atlassian/confluence/admin/help/configurelog4j.vm
/opt/atlassian/confluence/admin/help/configurelogo.vm
/opt/atlassian/confluence/dashboard/configurerssfeed.vm
/opt/atlassian/confluence/images/icons/configure_icon_16.gif
/opt/atlassian/confluence/images/raw/configure_icon_16.png
/opt/atlassian/confluence/spaces/common-configurelogo.vm
/opt/atlassian/confluence/spaces/configurespacelogo.vm
/usr/lib/python2.7/site-packages/cloudinit/config/cc_apt_configure.py
/usr/lib/python2.7/site-packages/cloudinit/config/cc_apt_configure.pyc
/usr/lib/python2.7/site-packages/cloudinit/config/cc_apt_configure.pyo
/usr/lib/systemd/rhel-configure
/usr/lib/systemd/system/rhel-configure.service
[centos@xxx ~]$