locate/which/whereis - コマンドの場所を探す 3 つの方法

locate/which/whereis - コマンドの場所を探す 3 つの方法

この記事で解決できること

リナ: ねえライニー先輩、コマンドをインストールしたはずなのに、どこに入ったかわからなくて困ってます……。
ライニー先輩: あーそれあるある!Linux には「コマンドの場所を探す」専用コマンドが 3 つあるんだ。whichwhereislocate — それぞれ特徴が違うから一緒に見ていこう。

この記事では次のことが分かります。

  • which でコマンドの実行ファイルパスを確認する方法
  • whereis でバイナリ・マニュアルをまとめて確認する方法
  • locate でファイル名を高速検索する方法
  • 3 つの使い分けの基準

1. which — 「今 PATH で使われるコマンドはどこ?」

リナ: which ってどんな場面で使うんですか?
ライニー先輩: たとえば python ってコマンドを打ったとき、Python 2 が動くのか Python 3 が動くのか、どのインストール先が優先されているか調べたいときに使うよ。

基本的な使い方

which python3
/usr/bin/python3

whichPATH に登録されているディレクトリを順番に調べて、最初に見つかった実行ファイルのパスを表示します。

which git
/usr/bin/git

which の検索範囲は $PATH 変数に入っているディレクトリだけ。echo $PATH でどのディレクトリが対象か確認できます。

コマンドが見つからない場合

which nonexistent-command

何も表示されない(終了コード 1)か、ディストリビューションによっては次のように表示されます。

which: no nonexistent-command in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
リナ: 何も表示されないのはなぜですか?
ライニー先輩: PATH の中にそのコマンドがないってこと。インストールされていないか、インストール先が PATH に入っていないかのどちらかだね。

複数バージョンが入っているときに便利

which python
which python3
/usr/bin/python
/usr/bin/python3

どの python が実際に動くか一目でわかります。


2. whereis — 「バイナリ・マニュアル・ソースをまとめて確認」

リナ: which で場所はわかりました。whereis は何が違うんですか?
ライニー先輩: which は「今使われる実行ファイルひとつ」しか教えてくれないけど、whereis は実行ファイル(バイナリ)、マニュアル(man ページ)、ソースコードの場所をまとめて教えてくれるんだ。

基本的な使い方

whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

/usr/bin/ls が実行ファイル、/usr/share/man/man1/ls.1.gz が man ページです。

whereis python3
python3: /usr/bin/python3 /usr/lib/python3 /usr/share/man/man1/python3.1.gz

フィールドの意味

出力フィールド 内容
コマンド名: の後の最初のパス 実行バイナリ
/usr/share/man/... man ページ
/usr/lib/... ライブラリ・追加ファイル
/usr/src/... ソースコード(インストールされている場合)

特定のフィールドだけ表示するオプション

whereis -b ls   # バイナリのみ
whereis -m ls   # man ページのみ
whereis -s ls   # ソースのみ
ls: /usr/bin/ls
ls: /usr/share/man/man1/ls.1.gz
ls:

whereiswhich と違い、現在の PATH に縛られません。標準的なシステムディレクトリ(/bin/usr/bin/usr/local/bin など)を固定で検索するため、PATH が壊れていてもコマンドを見つけられることがあります。


3. locate — 「ファイル名でファイルを高速検索」

リナ: locate はどんなときに使うんですか?
ライニー先輩: コマンドだけじゃなく、設定ファイルや任意のファイルをファイル名で素早く探したいときに使うよ。find より断然速い!

基本的な使い方

locate ssh_config
/etc/ssh/ssh_config
/usr/share/doc/openssh-client/examples/ssh_config

なぜ速いの?

locate はファイルシステムをリアルタイムに走査しません。あらかじめ作成されたデータベース(インデックス)を検索するため高速です。

locate のデータベースは定期的に(通常は 1 日 1 回)updatedb コマンドで自動更新されます。新しく作ったファイルはすぐに locate で見つからないことがあります。

データベースを手動更新する

sudo updatedb

これを実行してから locate すると、最新の状態で検索できます。

大文字・小文字を無視して検索

locate -i README
/home/user/projects/readme.md
/usr/share/doc/curl/README
/usr/share/doc/git/README.md

結果を絞り込む(パターンを含む行のみ)

locate nginx | grep conf
/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf

件数だけ確認したい

locate -c python
248

locate が使えない場合は sudo apt install mlocate または sudo dnf install mlocate でインストールできます。


4. 3 つのコマンドの使い分けまとめ

リナ: 結局、どれをいつ使えばいいのか、まとめてほしいです!
ライニー先輩: こんな感じで覚えよう!
やりたいこと 使うコマンド
「今実際に動くコマンド」のパスを知りたい which
コマンドの実行ファイル・man ページをまとめて確認したい whereis
ファイル名でファイルをすばやく探したい locate
最新状態でファイルを探したい(新規作成直後など) find

よく使う場面の例

  • python コマンドが Python 2 か 3 かを確認 → which python
  • git の man ページがどこにあるか確認 → whereis git
  • nginx.conf がどこにあるか調べる → locate nginx.conf
  • インストール直後のファイルを探す → sudo updatedb && locate ファイル名

5. よくある疑問と落とし穴

Q. which で何も表示されない → コマンドは本当にインストールされている?

リナ: which node を実行したら何も表示されませんでした。インストールしたはずなのに……。
ライニー先輩: まず whereis nodelocate node | grep bin を試してみて。それでも見つからなければインストール自体が失敗しているかも。あとは echo $PATH で PATH の内容も確認しよう。
# PATH を確認
echo $PATH

# より広いディレクトリで探す
whereis node

# インストール先を探す
locate node | grep "/bin/"

Q. locate が古いデータを返す

新しく作成したファイルが locate で見つからないとき:

sudo updatedb
locate 探したいファイル名

Q. locate コマンドが存在しない

# Debian / Ubuntu
sudo apt install mlocate

# Fedora / RHEL / CentOS
sudo dnf install mlocate

次に読む