ファイルを検索する必要がある場合、通常は find コマンドを使用します。 find は優れた検索ユーティリティですが、遅いです。
ただし、見つける ファイルをすばやく検索できます。
検索コマンドは非常に高速に動作しますが、いくつかの制限があるため、まだ検索コマンドを追い越していません.
この記事では、locate コマンドについて知っておくべきことをすべて説明します。
ロケート コマンドの仕組み– updatedb および updatedb.conf
検索が非常に高速であると言うとき、頭に浮かぶ最初の質問は、検索が非常に高速である理由は何かということです.
そうです、locate はディスク上のファイルを検索するのではなく、データベース内のファイル パスを検索します。
データベースは、システム上のファイルとそのパスに関する情報を含むファイルです。位置データベース ファイルは次の場所にあります:
/var/lib/mlocate/mlocate.db
次の論理的な質問は、この mlocate データベースを最新の状態に保つものは何かということです。
updatedb という別のユーティリティがあります。 . updatedb を実行すると、システム全体がスキャンされ、mlocate.db データベース ファイルが更新されます。
そのため、「locate」コマンドの 1 つの制限は、別のユーティリティ「updatedb」によって更新できるデータベースへの依存性です。したがって、「locate」コマンドから最新で信頼できる結果を取得するには、コマンドが動作するデータベースを定期的に更新する必要があります。
必要に応じて「updatedb」ユーティリティを構成することもできます。これは、updatedb.conf を更新することで実現できます。これは、データベースを更新する前に updatedb が読み取る構成ファイルです。 updatedb.conf は /etc/ の下にあります:
# 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"
updatedb.conf ファイルには、VARIABLES=VALUES の形式で情報が含まれています。これらの変数は次のように分類できます:
- PRUNEFS :updateb によってスキャンされるべきではないファイル システム タイプ (/etc/mtab で使用される) の空白で区切られたリスト。ファイル システム タイプの一致では、大文字と小文字が区別されません。デフォルトでは、スキップされるファイル システム タイプはありません。ファイル システムのスキャンがスキップされると、サブツリーにマウントされているすべてのファイル システムも、タイプが PRUNEFS のエントリと一致しなくてもスキップされます。
- PRUNENAMES :updateb によってスキャンされるべきではないディレクトリ名 (パスなし) の空白で区切られたリスト。デフォルトでは、ディレクトリ名はスキップされません。指定できるのはディレクトリのみであり、パターン メカニズム(グロビングなど)は使用されないことに注意してください。
- PRUNEPATHS :updateb によってスキャンされるべきではないディレクトリのパス名の空白で区切られたリスト。各パス名は、locate によってディレクトリが報告される形式と正確に一致している必要があります。デフォルトでは、パスはスキップされません。
- PRUNE_BIND_MOUNTS :0、いいえ、1、またははいのいずれかの文字列。 PRUNE_BIND_MOUNTS が 1 または yes の場合、バインド マウントは updateb によってスキャンされません。バインド マウントのサブツリーにマウントされたすべてのファイル システムも、バインド マウントでなくてもスキップされます。デフォルトでは、バインド マウントはスキップされません。
上記の構成情報はすべて、ユーティリティ「updatedb」のコマンド ライン オプションを使用して変更または更新することもできます。
検索コマンドの例を試す前に、必ず検索コマンドの例を調べてください。
Locate コマンドの実際の例
1.ロケートを使用してファイルを検索
ロケートを使用して特定のファイルを検索するには、次のようにします
$ locate sysctl.conf /etc/sysctl.conf /usr/share/man/man5/sysctl.conf.5.gz
次のコマンドは、システム全体で httpd.conf を検索します。
$ locate httpd.conf /etc/httpd/conf/httpd.conf /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.bak
「locate -0」を使用して、すべての出力を 1 行に表示することもできます。例:
$ locate -0 httpd.conf
2.カウントのみを表示
一致するエントリの数を取得するには、次に示すように locate -c を使用します。
$ locate -c httpd.conf 3
3. updatedb を使用して mlocate データベースを更新
既存のファイルのバックアップを作成したとします:
# cd /etc # cp sysctl.conf sysctl.conf.orig
「locate」ユーティリティを使用して sysctl.conf を検索しようとすると、sysctl.conf.orig が見つかりません。
# locate sysctl.conf /etc/sysctl.conf /usr/share/man/man5/sysctl.conf.5.gz
その理由は、sysctl.conf.orig が作成された後、locate ユーティリティが動作するデータベースが更新されないためです。それでは、「updatedb」コマンドを使用してデータベースを更新し、locate を再度実行してみましょう:
$ updatedb updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'
update db は root として実行する必要があることに注意してください。
# updatedb
updateb の後、locate を実行すると、sysctl.conf.orig ファイルが見つかります。
# locate sysctl.conf /etc/sysctl.conf /etc/sysctl.conf.orig /usr/share/man/man5/sysctl.conf.5.gz
4. mlocate データベースの場所の変更
ロケート ユーティリティが読み取るデフォルトのデータベースは /var/lib/mlocate/mlocate.db ですが、ロケート コマンドを別の場所に保持されている他のデータベースとリンクさせたい場合は、-d オプションを使用してください。
例:
$ locate -d <new db path> <filename>
データベース パスは stdin から取得することもでき、空のパスが指定された場合はデフォルトのデータベースが選択されることに注意してください。
5.ファイルの存在を確認
ここで、上記の例 3 で作成したファイル sysctl.conf.orig が削除されたとします。sysctl.conf を見つけようとすると、まだ sysctl.conf.orig ファイルが表示されます。
# cd /etc # rm sysctl.conf.orig # locate sysctl.conf /etc/sysctl.conf /etc/sysctl.conf.orig /usr/share/man/man5/sysctl.conf.5.gz
上記の出力からわかるように、ファイルが削除された後でも、locate コマンドは sysctl.conf.orig を表示します。この結果は誤解を招きます。
もちろん、updatedb を実行して、locate を再試行すると、適切な結果が表示されます。
または、locate コマンドを実行するときに、システムに存在するファイルのみを表示する「locate -e」を使用することもできます。つまり、ファイルが mlocate.db に存在する場合でも、ファイルを表示する前に、ファイルがシステムに物理的に存在することを確認します。
# locate -e sysctl.conf /etc/sysctl.conf /usr/share/man/man5/sysctl.conf.5.gz
6.位置特定出力で大文字と小文字を区別しない
既定では、locate コマンドは、大文字と小文字を区別してファイル名を受け入れるように構成されています。結果の大文字と小文字を区別しないようにするために、-i オプションを使用できます:
次の例では、小文字と大文字の両方を含む 2 つのファイルを作成しました。
# cd /tmp # touch new.txt NEW.txt # updatedb
小文字のみで locate コマンドを使用すると、小文字のファイルのみが検索されます。
# locate new.txt /tmp/new.txt
大文字と小文字を区別しないlocate -iを使用して、小文字と大文字の両方のファイルを探します。
$ locate -i new.txt /tmp/NEW.txt /tmp/new.txt /usr/share/doc/samba-common/WHATSNEW.txt.gz
7.ロケート出力の制限
次の例では、locate コマンドがいくつかのエントリを表示しています。
$ locate passwd /etc/passwd /etc/passwd- /etc/dovecot/conf.d/auth-passwdfile.conf.ext /etc/pam.d/passwd /etc/security/opasswd /etc/vsftpd/passwd /lib64/security/pam_unix_passwd.so /usr/bin/gpasswd /usr/bin/htpasswd /usr/bin/ldappasswd /usr/bin/mksmbpasswd.sh /usr/bin/passwd ..
特定の数のレコードのみを表示する場合は、locate -l オプションを使用して、locate コマンドの出力に表示するレコード数を指定します。
たとえば、次の例では 5 つのレコードのみが表示されます (locate コマンドで複数のレコードが見つかった場合でも..)
$ locate -l 5 passwd /etc/passwd /etc/passwd- /etc/dovecot/conf.d/auth-passwdfile.conf.ext /etc/pam.d/passwd /etc/security/opasswd
コマンドの例を探す
ご覧のとおり、locate コマンドの例はかなり簡単に使用できます。ただし、信頼性の高い出力を取得し、複雑な検索操作を実行するには、find コマンドを効果的に使用する方法も知っておく必要があります。
- ママ、見つけたよ! — 15 の実用的な Linux 検索コマンドの例
- パパ、見つけた!、15 の素晴らしい Linux 検索コマンドの例 (パート 2)