locateコマンドはファイルの場所を検索するコマンドになります。単純にファイル名が分かるけどファイルの場所が思い出せない場合に利用できます。また、よくあるトラブルとして同名のためにバージョンの異なるプログラムやライブラリを使用してしまうことがしばしばあります。その場合、locateコマンドを利用すると同じ名前のプログラムやライブラリの場所を一気に調べることができます。
目次
ファイルの場所を検索
locateコマンドはファイルパスの一部などパターン文字列を検索のキーワードとしてファイルの場所を検索できます。locateコマンドのオプションなどを使用しない場合、検索に利用されるパターン文字列はワイルドカードの文字列などを利用しなければ"*PATTERN*"が用いられ、このパターンにマッチングするようにファイルの場所が検索されます。
1 2 3 4 5 6 7 8 9 10 |
$ locate test_locate/ /home/ubuntu/test_locate/dir1 /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file2.txt /home/ubuntu/test_locate/file3.txt /home/ubuntu/test_locate/potato.c /home/ubuntu/test_locate/potato.h /home/ubuntu/test_locate/dir1/dir1_file1.txt /home/ubuntu/test_locate/dir1/dir1_file2.txt /home/ubuntu/test_locate/dir1/dir1_file3.txt |
また、共有ライブラリの場所を確認するために検索するのにも便利です。
1 2 3 4 5 6 7 8 9 10 |
$ locate libQt5Core.so.5 /home/ubuntu/test_gnuplot/qt-everywhere-src-5.15.0/qtbase/lib/libQt5Core.so.5 /home/ubuntu/test_gnuplot/qt-everywhere-src-5.15.0/qtbase/lib/libQt5Core.so.5.15 /home/ubuntu/test_gnuplot/qt-everywhere-src-5.15.0/qtbase/lib/libQt5Core.so.5.15.0 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1 /usr/local/lib/libQt5Core.so.5 /usr/local/lib/libQt5Core.so.5.15 /usr/local/lib/libQt5Core.so.5.15.0 |
ファイルの場所を正規表現を用いて検索
-r(--regexp)オプションを用いれば正規表現を用いれば、正規表現を用いてファイルを検索できます。
1 2 3 4 5 |
$ locate -r 'test_locate/.*file[13].*' /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file3.txt /home/ubuntu/test_locate/dir1/dir1_file1.txt /home/ubuntu/test_locate/dir1/dir1_file3.txt |
また、拡張正規表現を利用したい場合は--regexオプションを利用します。
1 2 3 |
$ locate --regex 'test_locate/.+file[13].+' /home/ubuntu/test_locate/dir1/dir1_file1.txt /home/ubuntu/test_locate/dir1/dir1_file3.txt |
検索箇所はファイルパス全体かベース名の部分か
locateコマンドはオプションなしのデフォルトでは、-w(--wholename)オプションの動作を行い、ファイルパス全体で検索がかけられます。
-b(--basename)オプションを用いるとディレクトリ部分を除いたファイルパスで検索を行うことができます。
1 2 3 4 5 6 |
$ locate 'potato*' $ locate -w 'potato*' $ $ locate -b 'potato*' /home/ubuntu/test_locate/potato.c /home/ubuntu/test_locate/potato.h |
検索されたファイルパスの数を表示
-c(--count)オプションを用いると検索されたファイルパスの数を表示できます。
1 2 |
$ locate -c 'test_locate/' 9 |
locateコマンドの注意事項
locateコマンドは一日一回の定期実行されるupdatedbコマンドで作成されるデータベースファイルからファイルの場所を検索してます。
なので、最近作成したファイルについては検索の対象になりません。その場合は自分でupdatedbコマンドを用いてデータベースファイルを更新するとファイルを検索できるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ locate '*test_locate/file*' /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file2.txt /home/ubuntu/test_locate/file3.txt $ $ touch file4.txt $ locate '*test_locate/file*' /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file2.txt /home/ubuntu/test_locate/file3.txt $ $ sudo updatedb $ locate '*test_locate/file*' /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file2.txt /home/ubuntu/test_locate/file3.txt /home/ubuntu/test_locate/file4.txt |
locateコマンドはファイルが存在しているかどうかについても気にしません。最近ファイルを削除した場合、そのファイルの検索結果が表示されてしまいます。ただし、ファイルの親ディレクトリが存在しない場合は表示がされません(削除されたディレクトリの名前は検索結果に表示されます)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ locate 'test_locate/' /home/ubuntu/test_locate/dir1 /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file2.txt /home/ubuntu/test_locate/file3.txt /home/ubuntu/test_locate/file4.txt /home/ubuntu/test_locate/potato.c /home/ubuntu/test_locate/potato.h /home/ubuntu/test_locate/dir1/dir1_file1.txt /home/ubuntu/test_locate/dir1/dir1_file2.txt /home/ubuntu/test_locate/dir1/dir1_file3.txt $ $ rm file4.txt $ rm -r dir1 $ locate 'test_locate/' /home/ubuntu/test_locate/dir1 /home/ubuntu/test_locate/file1.txt /home/ubuntu/test_locate/file2.txt /home/ubuntu/test_locate/file3.txt /home/ubuntu/test_locate/file4.txt /home/ubuntu/test_locate/potato.c /home/ubuntu/test_locate/potato.h |
補足:検索されないディレクトリの設定(updatedb.conf)
updatedbコマンドでデータベースファイルを作成する際に、検索から除外するディレクトリなどを設定する設定ファイルがあります。設定ファイルとして/etc/updatedb.confが利用されます。
/etc/updatedb.confは私の環境では以下のようになっています。
1 2 3 4 5 |
$ cat /etc/updatedb.conf PRUNE_BIND_MOUNTS="yes" # PRUNENAMES=".git .bzr .hg .svn" PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs /var/lib/schroot" PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ecryptfs fusesmb devtmpfs" |
例えば、PRUNEPATHSはupdatedbにスキャンされたくないディレクトリを指定します。
update.confについての詳しい説明は'man 5 updatedb.conf'で確認できます。
また、updatedbコマンドを行う際に-n(--add-prunenames)オプション等を用いると設定ファイルから追加でスキャンされたくないディレクトリ等を設定できます。