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

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

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

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

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

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

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

結論: which は PATH を順に調べ、今実際に実行される実行ファイルのパスファイルやディレクトリの場所を表す文字列。を 1 つ表示する。

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

基本的な使い方

which python3
/usr/bin/python3

which は PATH に登録されているディレクトリファイルをまとめて整理する入れ物。Windows や macOS の「フォルダ」と同じもの。を順番に調べて、最初に見つかった実行ファイルのパスを表示します。

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 が実際に動くか一目でわかります。

エイリアスや組み込みコマンドも調べる: type -a / command -v

リナ: Ubuntu で which cd を実行したら何も表示されませんでした。cd はいつも使えるのに……。
ライニー先輩: cd はシェル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。(bash)に組み込まれたコマンドなんだ。Ubuntu / Debian の which は PATH 上のファイルしか探さないから、組み込みコマンドやエイリアスは見つけられず、何も表示せずに終了コード 1 を返すんだよ。そういうときは type -a を使おう。

なお Fedora や RHEL 系では結果が変わります。bash パッケージが /usr/bin/cd などの組み込みコマンドの代替スクリプトをインストールするため which cd はそのパスを表示し、対話シェルでは /etc/profile.d/which2.sh により which がエイリアスやシェル関数も表示します。どの環境でも、実際に何が実行されるかは type -a で確かめるのが確実です。(出典: Fedora bash.spec、Fedora which2.sh、CentOS Stream 9 bash.spec / which2.sh, 取得日: 2026-09-25)

type -a cd
type -a ls
cd is a shell builtin
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls

type -a は、エイリアス・シェル組み込み・PATH 上の実行ファイルのうち該当するものをすべて表示します。先頭に表示されたものが、実際に実行される候補です(/usr/bin/ls と /bin/ls が両方出るのは、/bin が /usr/bin へのリンクになっている環境のためです)。

シェルスクリプトの中で「コマンドが使えるか」を確かめるときは、POSIX で定められた command -v が向いています。

command -v git
command -v cd
/usr/bin/git
cd

見つからない場合は何も表示せず、終了コード 1 を返します。そのため if command -v git >/dev/null 2>&1; then ... fi のように条件分岐に使えます。


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

結論: whereis は PATH に縛られず、実行ファイル・man ページ・ソースの場所をまとめて表示する。

リナ: 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:

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


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

結論: 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 が使えない場合は plocate パッケージをインストールします(sudo apt install plocate / sudo dnf install plocate)。ディストリビューションごとの違いは「よくある疑問と落とし穴」で説明します。


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

結論: 実行パスは which、関連ファイルは whereis、ファイル名検索は locate、最新状態は find と使い分ける。

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

よく使う場面の例

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

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

結論: which が空のときは whereis や locate で広く探し、locate が古ければ updatedb で更新する。

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

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

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

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

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

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

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

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

現在の主要ディストリビューションでは、locate は plocate パッケージで提供されます。plocate は従来の mlocate と互換の実装で、locate / updatedb の使い方は変わりません。

# Ubuntu 22.04 以降 / Debian 12 以降
sudo apt install plocate

# Fedora 36 以降 / Rocky Linux 10・AlmaLinux 10 など
sudo dnf install plocate

古いディストリビューションでは mlocate パッケージを使います。

# Ubuntu 20.04 / Debian 11 など
sudo apt install mlocate

# Rocky Linux 9 / AlmaLinux 9 など
sudo dnf install mlocate
ディストリビューション locate を提供するパッケージ
Ubuntu 20.04 / Debian 11 mlocate(Debian 11 は plocate も利用可能)
Ubuntu 22.04 / Debian 12 plocate(mlocate は plocate へ移行するためのダミーパッケージ)
Ubuntu 24.04 以降 / Debian 13 plocate(mlocate パッケージはない)
Fedora 36 以降 plocate(mlocate の後継。mlocate とは同時にインストールできない)
Rocky Linux 9 / AlmaLinux 9 mlocate
Rocky Linux 10 / AlmaLinux 10 plocate

(出典: Ubuntu Packages Search「mlocate」 / 「plocate」、Launchpad: mlocate in Ubuntu Focal、Debian パッケージ検索「mlocate」 / plocate、Fedora Changes/Plocate as the default locate implementation、Rocky Linux 9 BaseOS / 10 BaseOS、AlmaLinux 9 BaseOS / 10 BaseOS, 取得日: 2026-09-25)


次に読む

この記事を共有

次の一手