web-dev-qa-db-ja.com

ファイルを提供するパッケージを見つけるにはどうすればよいですか?

簡単な質問:使用できるシェルコマンド(またはGUIメソッド)はありますか?システム上のファイルへのパスを指定すると、どのパッケージにそこに配置されているかがわかりますか?ファイルが実際にパッケージから来たと仮定すると、それはそうです。

おまけの質問:システムにインストールされていないファイルの場合はどうなりますか?たとえば、ファイルを検索し、どのパッケージが提供されているかを確認できるWebサイトがありますか?

460
David Z

dpkgコマンドを使用して、どのインストール済みパッケージがファイルを所有しているかを確認できます。

man dpkgから:

-S、--search filename-search-pattern ... 
インストール済みパッケージからファイル名を検索します。

例:

$ dpkg -S /bin/ls
coreutils: /bin/ls

完全パスまたはファイル名のみで検索できます。

コンピューターにまだインストールされていないファイルを検索する場合は、 buntuパッケージ検索 を使用できます。

427
Ressu

apt-file コマンドは、コマンドラインからこれを行うことができます。ソースからパッケージをビルドするときに頻繁に使用します。システムにすでにインストールされているパッケージによって提供されるファイルの場合、 apt-cache が別の選択肢です。

apt-fileをインストールするには、次のようにします。

Sudo apt-get install apt-file

次に、データベースを更新する必要があります。

apt-file update

そして最後に、ファイルを検索します。

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

ただし、はるかに使いやすい方法は、 buntuパッケージ検索 Webサイトを使用することです。特定のファイル名を「パッケージの内容を検索する」オプションがあります。

235
jbowtie

また、インストールされていないパッケージ内のファイルを検索するためのapt-fileもあります。例えば:

apt-file list packagename
43
ptman

buntuパッケージ Webサイトで、さまざまなUbuntuリリースに含まれるパッケージの内容を検索できます。 「 パッケージの内容を検索 」という見出しの下を見てください。

たとえば、lucid(10.04)のlibnss3.soの検索結果は次のとおりです。

http://packages.ubuntu.com/search?searchon=contents&keywords=libnss3.so&mode=exactfilename&suite=lucid&Arch=any

17
moberley

つまり、どのアプリケーションではなく、どのパッケージですか。アプリケーションは、パッケージマネージャーです。 Software Center

dpkgを使用:

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

apt-fileを使用:

apt-file search /usr/lib/tracker/tracker-store

または可能:

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

またはオンライン ここ 、セクションSearch the contents of packagesで。

enter image description here

enter image description here

13
A.B.

これは Alexx Rocheの優れた答え の拡張です。私はその答えを編集しようとしましたが、 拒否されました (Alexxによるものではありません)


システムにwhichをインストールしたものを追跡しようとしていました。少し作業した後、/usr/local/bin/apt-whatprovidesを作成しました

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY="$(realpath $(which $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

ただし、インストールされているほとんどのTHINGには、次のものを使用できます。

apt-file search $(realpath $(which THING)) | grep 'THING$'

インストールされていないものについては、以下を使用できます。

apt-file search THING | grep '/THING$'

apt-whatprovidesスクリプトは、システム上にあるファイルとシステム上にないファイルに対して機能します。たとえば、私のシステムにはDigがありませんでしたが、pingがありました。

pi@raspberrypi:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

pi@raspberrypi:~ $ apt-whatprovides Dig
Searching for Dig
dnsutils: /usr/bin/Dig
epic4: /usr/share/epic4/script/Dig
epic4-help: /usr/share/epic4/help/8_Scripts/Dig
knot-dnsutils: /usr/bin/Dig

Searching forping(インストール済み)の完全なパスであり、Digのバイナリ名のみがインストールされていないことに注意してください。これにより、検索に行く必要なくdnsutilsをインストールする必要があることがわかりました https://packages.ubuntu.com/#search_contents

3
Bruno Bronosky

システムにwhichをインストールしたものを追跡しようとしていました。少し作業した後、apt-whatprovidesを作成しました

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

ほとんどの場合は使用できますが

apt-file search $(realpath $(which THING))|grep 'THING$'
3
Alexx Roche

これをしなければならない理由の1つは、すでにubuntuパッケージがあるソフトウェアをコンパイルしている場合、apt-get build-dep $PACKAGENAMEを実行できることです。 $PACKAGENAMEのコンパイルに必要なすべてのパッケージがインストールされます。

2
Rory