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


468

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

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


6
私はいつもこれを自分自身を不思議に思っていました-私はYUMであなたがyumをwhatprovides <ファイルパス> / <ファイル名>を行うことができます知っているが、私は本当にパッケージのウェブサイト以外の適性にそれに代わるものを発見したことがない
マルコケッピ


ここでの答えはどれもProvides:メカニズムを実際にカバーしていません。もう少し具体的に、のようなコマンドmailxまたははsendmailでバイナリとして含まれていない任意のパッケージ。代わりに、さまざまなパッケージが独自のバイナリをインストールし、それらの一部をを介して「標準」名で利用可能にします/etc/alternativesaskubuntu.com/questions/366135/
tripleee

回答:


439

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

からman dpkg

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

例:

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

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

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


5
ルックアップを高速化するために毎日更新されるdlocateの使用を強くお勧めします。
ダニエルTチェン

20
ヒント:完全なパスがわからないがコマンド名だけがわからない場合は、which彼のプログラムを見つけるために使用しますdpkg -S `which firefox`
。– Lekensteyn

1
@DanielTChen。ただしdlocate、dlocateのデータベースが古い場合は、ジョブを実行できない場合があります。sudo update-dlocatedb更新するには電話する必要があります。
jarno

2
dpkg正確なパスが何も返さない場合(例dpkg /usr/bin/java:)、実行可能ファイルの名前(例:)のみを試してくださいdpkg java
ダンダスカレスク

2
次のrealpathようなシンボリックリンクの解決にも使用できますdpkg -S $(realpath $(which <command>))
ラース・ナイストロム

236

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

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


21
私の意見では、これは受け入れられた答えであるべきです。しかし、Ubuntu Packages Searchに応えて、このシンプルなシェルプログラムは非常に友好的で覚えやすいと主張するかもしれません(一度知ったら)。dpkg、apt-get、またはaptitudeを標準ツールとして使用する場合、Chromeを起動してインターネットサーフィンを行うことには何の友好もありません。
user2097818

3
@ user2097818これが受け入れられない答えではない理由は、私の第一の質問がシステム上のファイルとインストールされているパッケージに制限されているからです。apt-file多くの場合、誤検出、つまりインストールされていないパッケージを検出します。もちろん、この答えは「ボーナス質問」に最適です。
デビッドZ

3
世界のRedhat側からのそれらのために- apt-file search <>に最も近いアナログdnf/yum whatprovides <>です。
フレドリング

apt-file findapt-findずっと前にエイリアスを作成しましたが、本当に便利です!ところで、最新バージョンにはのルートが必要ですapt-file update
val

43

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

apt-file list packagename

17

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

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

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


これは最近エラーを返すだけです。
パヴェルヴェセロフ

13

つまり、どのアプリケーションではなく、どのパッケージですか。アプリケーションは、たとえば、パッケージマネージャー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

ここに画像の説明を入力してください

ここに画像の説明を入力してください


つまり、どのアプリケーションではなく、どのパッケージですか。アプリケーションは、Software Centerなどのパッケージマネージャーです。はい。ありがとうございました!:)
ReyKev

すべての助けてくれてありがとう!これらの提案はどれも、どのパッケージがこの/これらのアプリケーションをインストールしたかを見つけるのに役立ちませんでした。すべての検索は「トラッカー」に戻ります。私はそれがEnthoughtsのキャノピーだったと疑っています。その1マイルの長さのEULAは、以前のMicrosoft Windowsの幻想を思い起こさせました。トラッカーが昨日インストールされたのを見たので、ルートとして、Enthoughtsのキャノピーとともにそれを取り除き、すべての問題は解決しました。本当にありがとうございます。このようなサポートができたことはとても素晴らしいことです。再度、感謝します!ケビン
レイケフ

4

これは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いない場合のバイナリ名にすぎないことに注意してください。これにより、https:dnsutils //packages.ubuntu.com/#search_contentsを検索する必要なくインストールする必要があることがわかりました


これは非常に良い答えなので、私のものを削除する必要があります!
アレックスロシュ

3

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$'

1
アレックス、私はこの答えが大好きです。私の編集を気にしないでください。システムにインストールされていないファイルでも機能するようにしました。gist.github.com/RichardBronosky/…でバックアップを作成し、元に戻す/拒否した場合は独自の回答を作成します。
ブルーノブロノスキー

更新:この答えをパスタにコピーして微妙な変更を加えるのはなめらかですが、私の編集は拒否されました。私はあなたの答えの整合性を維持ように感じる願って鉱山で
ブルーノブロノスキー

自由に編集またはハッキングしてください。あなたのためにそれを良くするものは何でも(だから私はMIT Licenceを追加しました!クレジットも必要ありません。)
Alexx Roche

2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.