locate/which/whereis - コマンドの場所を探す 3 つの方法
この記事で解決できること
リナ: ねえライニー先輩、コマンドをインストールしたはずなのに、どこに入ったかわからなくて困ってます……。
ライニー先輩: あーそれあるある!Linux には「コマンドの場所を探す」専用コマンドが 3 つあるんだ。
which、whereis、locate — それぞれ特徴が違うから一緒に見ていこう。この記事では次のことが分かります。
whichでコマンドの実行ファイルパスを確認する方法whereisでバイナリ・マニュアルをまとめて確認する方法locateでファイル名を高速検索する方法- 3 つの使い分けの基準
1. which — 「今 PATH で使われるコマンドはどこ?」
リナ:
which ってどんな場面で使うんですか?ライニー先輩: たとえば
python ってコマンドを打ったとき、Python 2 が動くのか Python 3 が動くのか、どのインストール先が優先されているか調べたいときに使うよ。基本的な使い方
which python3
/usr/bin/python3
which は PATH に登録されているディレクトリを順番に調べて、最初に見つかった実行ファイルのパスを表示します。
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:
whereis は which と違い、現在の 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 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 コマンドが存在しない
# Debian / Ubuntu sudo apt install mlocate # Fedora / RHEL / CentOS sudo dnf install mlocate