簡単にファイル検索をするためのlocateコマンドオリジナル活用法 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Linuxでファイルを探したい場合、findコマンドが一般的ですが、コマンド実行後に検索を開始するため、実行結果が得られるまでに結構な時間がかかったりします。

こういう場合、locateコマンドを使うことで、瞬時にファイルの情報を取り出すことができます。

実際にやってみればわかりますが、体感速度でも雲泥の差がでます。


locateコマンドは、updatedbコマンドにより、予めファイル一覧のDBを作っており、そのDBに問合せることで、高速にファイル検索を実現しています。

欠点としては、DBが使われてるが故に新規に作成したファイルはDBが更新されるまでは検索できないと言うところにあります。

そして、DBを更新するupdatedbコマンドは負荷がかかる上に時間もかかります。


ですので、頻繁に実行することは現実的ではなく、ほとんどのディストリビューションにはバンドルされているものの、cronで深夜にひっそりと動くように設定されています。


#!/bin/sh
nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }')
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"

一見、便利なのかどうか良くわからないlocateコマンドですが、使いようによっては色々なことができたりします。

例えば、毎日深夜にcronで動かす際に、DBを別々に保存しておけば、その日ごとのファイル一覧を保存したDBが作れたりします。

急にファイルが増えた際に、何時そのファイルが増えたのかや、インストールされたコマンドの一覧を取り出すなんてこともできます。


ここでは、オリジナルのlocate用DBを作りながら、locateコマンドの使い方を簡単に説明してみます。



locate用のオリジナルDBを作る


まずは、locate用のオリジナルDBを作ってみます。

DBの作成方法は、updatedbコマンドを使います。


# updatedb -U /var/www/htdocs/ -o /var/lib/mlocate/test.db

「-U」オプションは、DBに取り込む対象のディレクトリです。

上記の例では、Apacheのドキュメントルート以下を仮定して実行しています。

こうすることで、日々のコンテンツファイルの一覧をDBに格納しておくことができ、ファイルの増減を管理するのに役立ったりします。


次に「-o」オプションですが、これはオリジナルのDBファイルパスになります。

オリジナルのDB(オプションなしでupdatedbを実行した場合に更新されるDB)は、「/var/lib/mlocate/mlocate.db」なんかにあるかと思います。(ディストリビューションやバージョンによって異なっていると思いますが)

これで、ドキュメントルート以下のファイル一覧を格納したオリジナルのDBができました。


次に、そのDBからlocateコマンドを使ってファイルを検索してみます。


# locate -d /var/lib/mlocate/test.db *.html
/var/www/htdocs/html/error.html
/var/www/htdocs/html/index.html
/var/www/htdocs/html/login.html

ちゃんとできているようですね。

もし、DBに取り込みたくないディレクトリがある場合は、「-e」オプションの後にそのパスを指定しておきます。


# updatedb -U /var/www/htdocs/ -e /var/www/htdocs/images -o /var/lib/mlocate/test.db

これで、「/var/www/htdocs/images」ディレクトリにあるファイルは、DBに取り込まれません

除外したいディレクトリが複数あって、毎回書くのが面倒であれば、「/etc/updatedb.conf」ファイルの「PRUNEPATHS」変数に追記しておいても同様の効果が得られます。


PRUNEPATHS = "/afs /net /sfs /tmp /udev /var/spool/cups /var/tmp /var/www/htdocs/images"


オリジナルのDBを毎日更新する

例えば、下記のようなシェルスクリプトを作って、cronに登録しておけばその日ごとのlocate用DBを作成することも可能です。


#!/bin/sh
DAY=`date +%d` DBROOT=/var/www/htdocs/ DBPATH=/var/lib/mlocate/locatre_$DAY.db /usr/bin/updatedb -U $DBROOT -o $DBPATH

DBは「locate_xx.db」というファイル名(xxは日付)でできますので、その日に存在していたファイルを確認することもできます。(あくまでupdatedbコマンド実行時点の結果になりますが)

実行結果を比較すれば、その日に新しく作られたファイルや削除されたファイルの一覧を取り出すこともできるでしょう。

簡単なファイルを追跡ツールとして利用できるかもしれません。