Linuxでパッケージのインストール場所を調べるには、パッケージ内のファイル一覧、実行されるコマンド、ファイルの所有パッケージを区別します。Debian/Ubuntuなら dpkg -L パッケージ名、RPM系なら rpm -ql パッケージ名がファイル一覧の基本です。パッケージ全体が一つのフォルダーにまとまっているとは限りません。
目的別:最初に使うコマンド
パッケージ名が分かるなら一覧を調べ、ファイルのパスだけ分かるなら所有パッケージを逆引きします。以下は参照用で、インストール・削除・ファイル移動は行いません。通常、パッケージ情報の照会にsudoは不要です。
# Debian / Ubuntu:登録されているファイル一覧
dpkg -L curl
# Debian / Ubuntu:パスの所有パッケージ
dpkg -S /usr/bin/curl
# RHEL / Fedora等のRPM系:登録されているファイル一覧
rpm -ql curl
# RPM系:パスの所有パッケージ
rpm -qf /usr/bin/curl
curlと/usr/bin/curlは例です。実際のパッケージ名・パスに置き換え、利用しているディストリビューション側のコマンドだけを実行してください。コマンド名とパッケージ名が同じとは限らず、プログラム・ライブラリ・ドキュメントが別パッケージに分かれる場合もあります。
実際に呼び出すコマンドの場所:command -vとtype
command -v python3
# Bashで同名コマンドの候補や種類を調べる
type -a python3
command -vは現在のシェルでその名前がどう解決されるかを調べます。エイリアスや関数なら、必ずしもファイルの絶対パスが出るとは限りません。Bashのtype -aでは複数の候補も確認できます。whichもPATH上の実行ファイルを調べる用途に使われますが、パッケージの全ファイル一覧ではありません。
仮想環境やPATHの順序によって、/usr/binの実行ファイルより/home配下や/usr/local/binのものが先に選ばれることがあります。ファイル一覧の結果と、実際に実行されるものを別々に確認してください。シンボリックリンクはリンク自身とリンク先で所有パッケージが異なる場合があります。
# 確認済みの実ファイルパスを指定する例
ls -l -- /usr/bin/python3
readlink -f -- /usr/bin/python3
リンク先を確認したら、そのパスもdpkg -Sまたはrpm -qfで調べます。/binと/usr/binが統合された環境では、データベースに登録されたパス表記と入力した表記の違いも確認してください。
Debian・Ubuntu:dpkgの一覧・状態・所有者
dpkg -l
dpkg -s curl
dpkg -L curl
dpkg -S /usr/bin/curl
dpkg -lはパッケージの状態を含む一覧です。削除後の設定ファイルだけが残るrcなども表示されるため、全行がインストール済みとは限りません。通常のインストール済み状態はiiで、詳細はdpkg -sのStatusも確認します。
dpkg -Lはパッケージデータベースに登録されたファイルを表示します。インストール後に生成されたログ・データや、メンテナースクリプトが作成した追加ファイル等を完全に列挙するものではありません。登録されたファイルが今も存在するかはlsなどで別途確認します。
dpkg -Sに完全パスを指定すると、名前だけの検索より対象を絞れます。見つからない場合は、手動配置、別のパッケージ管理方式、リンクの表記、未インストールなどを確認します。見つからないことだけで不正なファイルとは判断できません。
# APTでインストール済み一覧とメタデータを確認
apt list --installed
apt show curl
apt showは説明・依存関係・バージョンなどのメタデータです。配置済みファイルの一覧が必要な場面ではdpkg -Lを使います。リポジトリにある情報が表示されることと、そのパッケージが現在インストールされていることも区別してください。
RHEL・Fedora等:rpmの一覧・状態・所有者
rpm -qa
rpm -qi curl
rpm -ql curl
rpm -qf /usr/bin/curl
-qaはインストール済みパッケージ一覧、-qiは詳細、-qlは登録ファイル一覧、-qfはファイルからの逆引きです。リポジトリにある全パッケージを列挙するわけではありません。パッケージが分割されている場合は、実際のファイルを-qfで調べてから、得られたパッケージ名で-qlを実行すると対象を絞れます。
DNFやYUMのinfoはメタデータ確認に使えますが、それだけでインストール先の全ファイルは分かりません。DNFの世代や環境で構文が異なる場合があるため、ここでは配置ファイルの確認にrpmの問い合わせを使います。
# 利用している管理ツールに合わせた情報確認の例
dnf info curl
# YUMを使う環境の場合
yum info curl
whereis・findは補助的に使う
whereis gcc
# 調べたい範囲を限定する。名前は説明用の例
find /usr/local/lib -name 'libexample.so*' -print
whereisは標準的な場所等からバイナリ・ソース・マニュアルを探す道具で、所有パッケージの完全な一覧ではありません。findは指定範囲の実ファイル名を探しますが、そのファイルを誰がインストールしたかは判定しません。
最初からfind /で全領域を走査すると、時間がかかったり、別のマウント領域に入ったり、権限エラーが大量に出たりします。候補ディレクトリに絞り、エラーを見て探索できなかった範囲を把握してください。ファイルが見つからないからといって、すぐにsudoや権限変更へ進まないようにします。
Pythonのpip・仮想環境はOSパッケージと別
python3 -m pip show requests
python3 -m pip show --files requests
requestsは例です。使っているPython環境のpipで、Locationとファイル一覧を確認します。仮想環境なら対象の環境を有効化するか、その環境のPythonを明示します。pipが導入されていない場合もあるため、この調査のためだけにシステムへ追加インストールする必要はありません。
python3の実行ファイルの場所と、pipで導入したライブラリの場所は別です。Snap・Flatpak・コンテナ・言語別パッケージ管理を使っている場合も、OSのdpkg/rpmだけでは把握できません。コンテナ内のパッケージを調べるなら、そのコンテナの環境で確認します。
ソースから手動インストールした場合
パッケージデータベースにない場合は、導入時の手順、ビルド設定、インストールログやマニフェストを確認します。configureを使うプロジェクトでは–prefixなどの設定が手がかりですが、configureというスクリプト自体が/usr/localへインストールされるという意味ではありません。既定値や変数名はプロジェクトごとに異なります。
ソースやビルドディレクトリが残っていれば、記録済みの設定やMakefileを読みます。場所の確認だけのためにmake installを再実行しないでください。/var/logに必ず導入ログが残るわけではなく、ログを見つけられないことは未インストールの証明にはなりません。
確認と移動・再インストールを分ける
場所の確認に、dpkg-divert、rpmrebuild、ソースからの再インストールは不要です。dpkg-divertはパッケージファイルの配置を迂回させる管理機能で、アプリ全体を任意のフォルダーへ安全に移す万能な方法ではありません。既存のファイルを移すと更新・依存関係・サービス起動に影響することがあります。
別の場所への導入が本当に必要なら、ソフトウェアが対応する導入方式とバックアップ・復旧方法を別途検討します。古いバージョンを固定したダウンロード例や、未確認のスクリプトを実行して調査を置き換えないでください。
読み取りだけで試す確認例
# Debian / Ubuntuでbashパッケージを調べる例
dpkg -s bash
dpkg -L bash
command -v bash
# RPM系で同じ目的の場合
rpm -qi bash
rpm -ql bash
自分の環境に合う側のコマンドで、実行ファイル以外に設定・文書等のファイルも列挙されることを確認します。表示されたパスの一つを逆引きし、どのパッケージの記録なのかを確認すると、コマンドの場所とパッケージの範囲の違いが分かります。
公式資料
Debian:dpkg-query/Debianのパッケージ管理ツール/RPMマニュアル/Bashマニュアル/pip show/dpkg-divert。


コメント