Linux 講座 / ファイルとコマンドの検索 - find, locate, which, whereis

ファイルを実際のディレクトリで条件に基づいて探すには find、事前に作ったファイル名インデックスから素早く探すには locate を使用します。実行するコマンドの位置が気になるときは which または whereis を使いますが、エイリアス・関数まで含めてシェルが何を実行するか知りたい場合は Bash の type や command -v の方が適しています。この講座は、探す対象に応じてツールを使い分けます。

検索結果がファイルの内容かパスかをまず区別してください。内容から特定の行を探す方法は テキスト検索と集計 で扱います。

find で現在のファイルシステムを検索する

find は指定した開始ディレクトリ以下を巡回し、名前、種類、サイズなど条件に合う項目を見つけます。次の実習は Bash と GNU find を前提とします。~/linux-course-11-practice がすでに存在する場合は他の名前を選んでください。最初の mkdir が失敗した場合は、後のコマンドを実行しないでください。

mkdir ~/linux-course-11-practice
cd ~/linux-course-11-practice
mkdir drafts archive
touch drafts/notes.txt drafts/todo.md archive/old.txt

pwdで実習の場所を確認した後、.txtで終わる一般ファイルを探してみてください。引用符はシェルが*.txtを先に展開できないようにし、パターンをfindにそのまま渡します。-maxdepth 2は開始点から2段階までしか調べないGNUオプションです。

pwd
find . -maxdepth 2 -type f -name '*.txt'

出力順序はファイルシステムによって異なりますが、2つのパスが出力されるはずです。

./drafts/notes.txt
./archive/old.txt

-type fは一般ファイルを、-nameは名前パターンを指定します。大文字小文字を無視した名前検索にはGNU findの-inameを使用できます。実際の運用ディレクトリでは、権限のないサブパスがあるためにエラーが発生する可能性があり、findが出力したパスだけではファイル内容を読む権限まで確認したことにはなりません。

locateでファイル名のインデックス検索をする

locateは現在のツリーを巡回する代わりに、あらかじめ構築されたファイル名データベースを検索します。データベースが用意されていれば広範囲の名前検索は高速ですが、最後の更新以降に作成されたファイルはまだ検索されないことがあり、既に削除した名前が一時的に残ることもあります。実装と設定によっては、権限のないパスの表示方法も異なります。

locate hosts

検索結果に/etc/hostsが含まれる場合がありますが、他のパスも表示されることがあります。locateが存在しない、またはデータベースがまだない場合は、インストール済みディストリビューションの提供ツールとインデックス更新方法を確認してください。例えばGNU Findutilsのupdatedbはインデックスを更新しますが、実行場所や権限はシステム設定に従います。現在存在するファイルを確実に確認したい場合は、findやlsで再度確認してください。

実行ファイルのパスを確認する

whichは通常PATH環境変数の検索パスから実行ファイルを探します。例えば以下のコマンドはls実行ファイルのパスを表示することができます。/usr/bin/lsや/bin/lsのように、結果はシステムによって異なります。

which ls

ただしwhichの実装はシステムごとに異なり、シェルのエイリアスや関数が実際の入力を横取りする場合まで同じ方法で反映されるとは限りません。Bashで現在のシェルがコマンド名をどのように解釈するかを確認する場合は、次のコマンドの方がより直接的です。

type -a ls
command -v ls

type -aは、同じ名前の別名・関数・組み込みコマンド・実行ファイルの候補を表示することができ、command -vはシェルでその名前を見つけられるかどうか確認する際に便利です。出力形式は現在のシェル設定によって異なります。

whereisでバイナリとマニュアルの位置を確認

whereisは、コマンド名に関連する実行ファイル、ソース、マニュアルの位置を知らせるツールです。例えばwhereis lsは、バイナリのパスとマニュアルのパスを一緒に表示することができます。すべての項目がインストールされているという意味ではなく、探索場所も実装と設定によって異なります。

whereis ls
気になること まず使用するツール 注意点
現在のディレクトリツリーの条件に合うファイル find 範囲と権限によって検索時間・エラーが異なる
インデックスに記録されたファイル名 locate インデックスが古い場合、実際の状態と異なることがあります
PATHの実行ファイルパス which エイリアス・関数までのシェル解釈と区別
シェルがコマンド名を解釈する方法 type -a, command -v 現在のシェルの設定に依存
コマンドのバイナリ・マニュアルの場所 whereis 検索対象と結果は環境に依存

ファイル名検索とコマンド解釈検索は別の問題です。findでlsというファイルを見つけたとしても、現在のシェルで入力したlsが必ずしもそのファイルを実行するわけではありません。混乱した場合はtype -a lsの結果を確認してください。

Ubuntu 26.04ではUniverseリポジトリでplocateパッケージが提供されています。locateがない場合は、sudo apt install plocateの後にsudo updatedbでインデックスを準備できます。Rocky Linux 9ではdnf provides '*/locate'でアクティブリポジトリの提供パッケージをまず確認し、該当パッケージをインストールします。updatedbはシステムを巡回するため、実習VMで実行し、除外パス・権限・インデックス更新時点のために検索結果がリアルタイムのファイル一覧と異なる可能性があることを確認してください。

公式ドキュメント

GNU Findutils マニュアルで find と locate を、GNU Bash 組み込みコマンドのドキュメントで type と command を確認できます。whereis の実装ごとのオプションは、インストールされているシステムの man whereis を参照してください。