このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

新Linuxコマンド演習37

新Linuxコマンド演習37 概要

 「新Linuxコマンド演習37」では、locateコマンドを使ってシステム内のファイルを素早く検索する方法を学びます。
 locate は、ファイルシステムを直接走査する find コマンドとは異なり、あらかじめ作成されたデータベースからファイル名を検索します。
そのため、非常に高速に結果を表示できるのが特徴です。

 また、grep コマンドを組み合わせた検索の絞り込みや、データベースの手動更新 (updatedb) の方法も併せて学びます。

locateコマンドの概要

コマンド主な機能
locate 文字列ファイル名データベースから文字列を含むファイルやディレクトリを検索
locate -c 文字列検索結果の件数を表示
locate パターン(メタキャラクタ使用)特定パターンに一致するファイル・ディレクトリを検索
locate 文字列 | grep 正規表現結果をさらに絞り込む
updatedbファイル名データベースを手動で更新する(root権限が必要)

表の説明
 locateは、内部的に/var/lib/mlocate/mlocate.db(または同等のパス)に保存されたファイル一覧データベースを参照します。
 そのため、ファイルを新規作成または削除しても、データベースが更新されるまでは検索結果に反映されません。
updatedbを実行することで、データベースを最新状態に更新できます。

演習問題+模範解答例

演習01:'hosts'を含むファイルやディレクトリを検索する

問題
ファイル名またはディレクトリ名に「hosts」を含むものを検索してください。

模範解答例

[suzuki@AlmaLinux ~]$ locate hosts
/etc/hosts
/etc/avahi/hosts
/etc/chromium/native-messaging-hosts
/etc/chromium/native-messaging-hosts/org.gnome.browser_connector.json
/etc/chromium/native-messaging-hosts/org.gnome.chrome_gnome_shell.json
/etc/opt/chrome/native-messaging-hosts
(省略)

解説

  • locate hosts は、名前に「hosts」という文字列を含む全てのファイル・ディレクトリを検索します。
  • データベースに登録されている範囲で検索されるため、非常に高速に結果が表示されます。

演習02:検索結果の件数を表示する

問題
「hosts」を含むファイルやディレクトリがいくつあるか件数を表示してください。

模範解答例

[suzuki@AlmaLinux ~]$ locate -c hosts
527

解説

  • -c オプションは「count(件数)」の略で、検索結果の総数のみを表示します。
  • 表示内容を省略して件数だけを確認したい場合に便利です。

演習03:メタキャラクタを使った検索

問題
メタキャラクタ( * )を使って、特定のパターンに一致するファイルを検索してください。

模範解答例

[suzuki@AlmaLinux ~]$ locate '*sh*Color*'
/usr/share/app-info/icons/rhel-9/128x128/org.gnome.ColorProfileViewer.png
/usr/share/app-info/icons/rhel-9/64x64/org.gnome.ColorProfileViewer.png
/usr/share/applications/org.gnome.ColorProfileViewer.desktop
/usr/share/dbus-1/interfaces/org.freedesktop.ColorHelper.xml
(省略)

解説

  • * は任意の長さの文字列にマッチするワイルドカードです。
  • この例では「sh」と「Color」の間に任意の文字列を含むファイルを検索しています。
  • locateではシェルによる展開を避けるため、* を引用符(シングルクォートまたはダブルクォート)で囲むのが一般的です。

演習04:grepコマンドによる絞り込み検索

問題
locateコマンドで「hosts」を検索し、その結果から /etc 以下にあるファイルだけを表示してください。

模範解答例

[suzuki@AlmaLinux ~]$ locate hosts | grep '^/etc'
/etc/hosts
/etc/avahi/hosts
/etc/chromium/native-messaging-hosts
/etc/chromium/native-messaging-hosts/org.gnome.browser_connector.json
/etc/chromium/native-messaging-hosts/org.gnome.chrome_gnome_shell.json
/etc/opt/chrome/native-messaging-hosts
/etc/opt/chrome/native-messaging-hosts/org.gnome.browser_connector.json
/etc/opt/chrome/native-messaging-hosts/org.gnome.chrome_gnome_shell.json
/etc/samba/lmhosts

解説

  • grep '^/etc' は、行頭( ^ )が「/etc」で始まる行だけを抽出します。
  • locateコマンドの出力結果をパイプ( | )でgrepに渡すことで、特定ディレクトリ配下に絞り込みできます。
  • locateの結果が膨大な場合、grepを組み合わせると非常に効率的です。

演習05:ファイル名データベースの更新

問題
locateコマンドが参照するファイル名データベースを最新の状態に更新してください。

模範解答例

[suzuki@AlmaLinux ~]$ sudo updatedb
[sudo] suzuki のパスワード:

解説

  • updatedb コマンドは、ファイル名データベースを再構築します。
  • 通常は自動的に定期更新されますが、手動で即時更新したい場合に使用します。
  • sudo 権限またはrootユーザーで実行する必要があります。
  • データベースの場所は通常 /var/lib/mlocate/mlocate.db にあります。

まとめ

新Linuxコマンド演習37」では、以下の内容を実践的に学びました。

  • locateコマンドの基本的な使い方
  • メタキャラクタやgrepを使った柔軟な検索方法
  • updatedbによるデータベース更新の重要性

locateは、findより高速だが最新情報には反映が遅れるという特徴があります。
 そのため、「最新情報を即座に探すならfind」「高速に広範囲を探すならlocate」と使い分けることが重要です。