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コマンド実行時点の結果になりますが)
実行結果を比較すれば、その日に新しく作られたファイルや削除されたファイルの一覧を取り出すこともできるでしょう。
簡単なファイルを追跡ツールとして利用できるかもしれません。
[PR]お名前.comのホームページ作成ツール★誰でも簡単にWebクリエイターに
[PR]光ファイバー/ADSLを楽しむなら「安心」「安全」の@nifty!
[PR]キャンペーン開催中!パソコンを買替えるならFRONTIER
関連記事
ImageMagickを使ってコマンドラインからCAPTCHAを作ってみる
inotifyを使ってファイルやディレクトリに起きたイベントを簡単に監視する
不要なファイルやディレクトリを削除できる「tmpwatch」コマンド
logrotateでローテーションされるファイル名を変更する