locateコマンドとupdatedbコマンド
この記事を読んでほしいひと
LPIC level1習得を目ざす、初学者のかたへ。
コマンドの基本的な使い方について、解説をします。
今回の内容
今回は、locateコマンドとupdatedbコマンドについて解説します。
locateコマンドの便利さと、updatedbコマンドの重要さがわかるようになります。
locateコマンド
locateコマンドとは、データベースからファイルを検索するコマンドです。同じように検索するコマンドとしてfindコマンドがありますが、findコマンドはディスク内そのものから検索します。それに対してlocateコマンドは、ディスクから作成されたデータベースをもとに検索を行います。ディスクそのものを検索しないため、locateコマンドはfindコマンドより速く検索できるのです。
他にfindコマンドの違いとして、findコマンドでは様々なオプションを用いて詳細な検索を行うことができますが、オプション指定の方法が若干難しいです。一方locateコマンドはfindコマンドと比べ、速く簡単に検索を行えるため、簡単な検索ならlocateコマンドを用いたほうが良いと思われます。
では早速テキストファイルを作成して検索してみましょう。まずsak.txtをDocumentsディレクトリ下に作成してlocateコマンドで検索してみます。
[root@localhost Documents]# touch sak.txt #sak.txtをDocumentsディレクトリ下に作成する [root@localhost Documents]# locate sak.txt #locateコマンドによりsak.txtを検索する (省略) No such file or directory #そんなファイルはありません
なんと検索結果に表示されませんでした! Documentsディレクトリ下にちゃんと作成してあるかlsコマンドで確認してみましょう。
[root@localhost Documents]# ls #Documentsディレクトリ下にあるファイルを表示 sak.txt
lsコマンドではちゃんと表示されました。これはどういうことだろう……そう思われた方が多いと思います。じつはこの現象、先ほどのべた「locateコマンドはデータベースから検索する」ことと関係しているのです(ナンダッテー)。ディスク内にはsak.txtは作成されていますが(lsコマンドで表示されましたね)、まだデータベースの情報が作成(更新)されておらずlocateコマンドで検索できなかったのです! なので次に紹介するupdatedbコマンドを実行するとデータベースの情報が作成(更新)され、locateコマンドで表示されるようになります。
locateコマンドはfindコマンドに比べて早く簡単に検索できるが、
updatedbコマンドでデータベースの作成(更新)が行われないと検索できない。
updatedbコマンド
updatedbコマンドは、locateコマンドで実行するさいに使用されるデータベースの作成(更新)を行うコマンドです。では先ほどの続きでupdatedbコマンドを実行し、正しく検索されるか確認してみましょう。
[root@localhost ~]# updatedb #updatedbコマンドによりデータベースが作成される [root@localhost ~]# locate sak #locateコマンドは一部分でも検索可能なので今回はsakで検索 /root/Documents/sak.txt /usr/share/zoneinfo/Africa/Lusaka /usr/share/zoneinfo/posix/Africa/Lusaka /usr/share/zoneinfo/right/Africa/Lusaka
これで正しく表示されることが確認できました。なお、検索した文字を含むファイル名を表示するのがlocateコマンドなので、Lusakaというファイルも表示されました。これでめでたくファイルを検索することができましたとさ。めでたしめでたし。
(……いやぁ、ここまで読まれた方お疲れさまです。ここまで読まれた方ならlocateコマンドとupdatedbコマンドの概要をつかめたのかなと思います。すごい! 実はこのブログ「きちんと学べる」サイトを目指してるんですよね。なので次に話す内容は少し発展的な内容を含むことになります。今までの内容ちょっと難しいなぁ…と感じている方は確認問題に挑戦してみてください。そして次読むときにぜひ読んでみてください。同じ文章を2度読むって意外と発見がありますからね。もちろん次に話す内容は、初めて読む方でも分かりやすいように書いてありますし、なにより意欲的な方は大歓迎です。挑戦する心はすばらしい。では続きをはじめましょう!)
ここで「locateコマンドは簡単に検索できるけれど、いちいち検索する前にupdatedbコマンド打たないといけないから、逆に面倒なのでは?」と疑問に思われた方がいらっしゃると思います。じつはupdatedbコマンドを入力しなくて済むよう定期的に実行されるようになっております(ベンリダナー)。これはcronデーモンと呼ばれる、定期的にコマンドを実行するデーモンが行っております。
ここでupdatedbコマンドが入っているcronの設定ファイルを確認してみましょう。
[root@localhost ~]# ls /etc/cron.daily #cron.dailyディレクトリ下にあるファイルを検索 logrotate man-db.cron mlocate
mlocateというファイルがありますが、こちらがlocateコマンドなどを含んでいるパッケージと呼ばれるものになります。これらのパッケージのおかげで、定期的に実行されるようになっているのです。ちなみにmlocateファイルの左に「man-db.cron」とデータベースかな?と思われるファイルがありますが、locateコマンドの検索に使われるデータベースは「/var/lib/mlocate/mylocate.db」なので注意しましょう。
(…というわけで以上難しい内容が終了しました! cronデーモンすごいんだなぁ、と感じることができたら正しく読めてますので安心してください。では感動のフィナーレまであと少し!)
ここでlocateコマンドを使用するさい、次のようなケースがあることに注意してください。
・locateコマンドで表示されたファイルが、実際のディスク上には存在しない
・locateコマンドでは表示されないのに、実際のディスク上ではファイルが存在する
2番目のケースは最初に紹介しましたね(sak.txtが表示されなかったケースです)。1番目のケースに興味ある方は試しに「sak.txt」を削除してみてください。するとlocateコマンドでは表示されるけど、lsコマンドでは表示されないという体験を味わえますが、ここまで読まれた方ならその理由はわかり、不思議さではなく必然さを感じられていることでしょう。
updatedbコマンドによりデータベースの作成(更新)が行われ、cronデーモンにより定期的に実行されている。
データベースと実際のディスク上が一致していない場合もあるので注意する。
まとめ
今回は、locateコマンドとupdatedbコマンドの特徴と関係性についてお話しました。
locateコマンドを使用するとfindコマンドに比べて高速かつ簡単に検索することができます。
そしてcronデーモンによりupdatedbコマンドが定期的に実行される一方で、実際のディスクとデータベースの中身が違う場合もあることに注意しなければなりません。
最後に確認問題で、今回の記事の知識を復習してみましょう。
確認問題
locateコマンドについて、findコマンドと比較した場合の特徴を2つ述べてください。