locate/which/whereis - コマンドの場所を探す 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)
複数バージョンが入っているときに便利
which python which python3
/usr/bin/python /usr/bin/python3
どの python が実際に動くか一目でわかります。
エイリアスや組み込みコマンドも調べる: type -a / command -v
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)