Frage Wie finde ich das Paket, das eine Datei bereitstellt?


Einfach genug Frage: Gibt es einen Shell-Befehl (oder eine GUI-Methode), den ich verwenden kann, da der Pfad zu einer Datei auf meinem System mir sagt, welches Paket es dort abgelegt hat? Angenommen, die Datei stammt tatsächlich aus einem Paket.

Bonusfrage: Was ist, wenn es sich um eine Datei handelt, die nicht auf meinem System installiert ist? Gibt es zum Beispiel eine Website, auf der ich eine Datei nachschlagen und sehen kann, welche Pakete, wenn überhaupt, diese zur Verfügung stellen?


381
2017-07-30 08:10


Ursprung


Das habe ich mich schon immer gewundert - ich weiß, mit YUM kann man machen, was <Dateipfad> / <Dateiname> liefert, aber ich habe nie wirklich eine Alternative zu Aptitude gefunden, außer der Packages-Website - Marco Ceppi♦
Gleich auf SU: superuser.com/questions/10997/ ... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Keine der Antworten hier deckt tatsächlich die Provides: Mechanismus. Genauer gesagt, ein Befehl wie mailx oder sendmail ist nicht als Binärdatei enthalten irgendein Paket; stattdessen installieren verschiedene Pakete ihre eigenen Binärdateien und stellen dann einige davon unter einem "kanonischen" Namen zur Verfügung /etc/alternatives. Siehe auch askubuntu.com/questions/366135/ ... - tripleee


Antworten:


Sie können verwenden dpkg Befehl um herauszufinden, welches installierte Paket eine Datei besitzt:

Von man dpkg:

-S, --such Dateiname-Suchmuster ...
                  Suchen Sie nach einem Dateinamen aus installierten Paketen.

Beispiel:

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

Sie können entweder mit einem vollständigen Pfad oder nur mit dem Dateinamen suchen.

Wenn Sie nach Dateien suchen möchten, die noch nicht auf Ihrem Computer installiert sind, können Sie die Ubuntu-Pakete suchen


359
2017-07-30 08:42



Ich empfehle dringend, dlocate zu verwenden, das täglich für schnellere Suchvorgänge aktualisiert wird. - Daniel T Chen
Tipp: Wenn Sie nicht den vollständigen Pfad, sondern nur den Befehlsnamen kennen, verwenden Sie which um das Programm zu finden: dpkg -S `which firefox` - Lekensteyn
Dies funktioniert auch für Bibliotheken, was besonders praktisch ist, wenn Sie eine Binärdatei haben, die nicht ausgeführt werden kann, da Sie sie mit ldd untersuchen können und die vollständigen Bibliothekspfade verwenden können, um die fehlenden Pakete zu finden. - Alain O'Dea
@DanielTChen, aber dlocate funktioniert möglicherweise nicht, wenn dlocates Datenbank veraltet ist. Du musst anrufen sudo update-dlocatedb um es zu aktualisieren. - jarno
Ob dpkg Der genaue Pfad gibt nichts zurück (z. dpkg /usr/bin/java), versuchen Sie nur den Namen der ausführbaren Datei (z. dpkg java). - Dan Dascalescu


Das apt-file Befehl kann dies für Sie von der Befehlszeile aus tun. Ich benutze es häufig beim Erstellen von Paketen aus der Quelle. Für Dateien, die von Paketen bereitgestellt werden, die bereits auf Ihrem System installiert sind, apt-cache ist eine andere Wahl.

Installieren apt-file, machen:

sudo apt-get install apt-file

Dann müssen Sie die Datenbank aktualisieren:

apt-file update

Und schließlich, durchsuchen Sie die Datei:

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

Eine viel freundlichere Art ist es jedoch, die Ubuntu-Pakete suchen Webseite. Sie haben die Möglichkeit, den Inhalt von Paketen nach einem bestimmten Dateinamen zu durchsuchen.


187
2017-08-11 02:43



Meiner Meinung nach sollte dies die akzeptierte Antwort sein. Aber als Antwort auf Ubuntu-Pakete suchenIch könnte argumentieren, dass ein Shell-Programm so einfach ist extrem freundlich und leicht zu merken (sobald Sie es wissen). Wenn Sie dpkg, apt-get oder aptitude als Standard-Tools verwenden, gibt es nichts Freundliches daran, Chrome zu starten, um im Internet zu surfen! - user2097818
@ user2097818 Der Grund, warum dies nicht die akzeptierte Antwort ist, besteht darin, dass meine primäre Frage auf Dateien auf dem System und den installierten Paketen beschränkt ist. apt-file findet oft falsche Positive, d. h. Pakete, die nicht installiert sind. Natürlich ist diese Antwort großartig für die "Bonusfrage". - David Z
Für diejenigen von der Redhat-Seite der Welt - apt-file search <> ist das nächste Analog zu dnf/yum whatprovides <>. - ffledgling


Es gibt auch eine apt-Datei zum Suchen von Dateien in Paketen, die nicht installiert sind. Beispielsweise:

apt-file list packagename

35
2017-07-30 08:49



genau das was ich gesucht habe. Vielen Dank - NES


Sie können den Inhalt von Paketen durchsuchen, die in den verschiedenen Ubuntu - Versionen auf der Ubuntu-Pakete Webseite. Schau unter der Überschrift "Durchsuchen Sie den Inhalt von Paketen".

Hier sind zum Beispiel die Suchergebnisse für libnss3.so in lucid (10.04):

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


16
2017-08-11 02:42





Du meinst, welches Paket und nicht welche Anwendung. Die Anwendung ist Ihr Paketmanager, z.B. Software Center.

Verwenden dpkg:

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

Beispiel

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

Verwenden apt-file:

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

oder auch möglich:

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

Beispiel

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

Oder online Hier, im Bereich Search the contents of packages.

enter image description here

Beispiel

enter image description here


10
2017-11-29 15:57



Du meinst, welches Paket und nicht welche Anwendung. Die Anwendung ist Ihr Paketmanager, z.B. Softwarezentrum. Okay. Vielen Dank! :) - ReyKev
Danke für die Hilfe! Keiner dieser Vorschläge hat mir geholfen, herauszufinden, welches Paket diese / diese Anwendungen installiert hat. Alle Suchanfragen führen einfach zurück zu "Tracker". Ich vermutete, dass es Enthoughts 'Canopy war. Dieser kilometerlange EULA erinnerte mich an meine alte Microsoft Windows Benommenheit, mit der ich so froh bin, dass ich nicht mehr involviert bin. Ich habe gesehen, dass Tracker gestern installiert wurde, also wurde ich als root zusammen mit Enthoughts Canopy los und alle Probleme sind gelöst. Ich danke dir wirklich für deine Hilfe. Es ist so großartig, eine solche Unterstützung zu haben. Danke noch einmal! Kevin - ReyKev


Ich habe versucht herauszufinden, was installiert ist which auf meinem System. Nach ein wenig Arbeit habe ich apt-whatprovides erstellt

#!/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%:*}

Obwohl für die meisten Dinge können Sie einfach verwenden

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

2
2018-03-17 15:25



Alexx, ich liebe diese Antwort. Ich hoffe es macht dir nichts aus meiner Bearbeitung. Ich habe es auch für Dateien gemacht, die nicht auf dem System installiert sind. Ich habe eine Sicherung erstellt gist.github.com/RichardBronosky/... und erstellt meine eigene Antwort, wenn Sie es zurücknehmen / ablehnen. - Bruno Bronosky
Update: Es fühlt sich schleimig an, Pasta diese Antwort zu kopieren und subtile Änderungen daran vorzunehmen, aber mein Schnitt wurde abgelehnt. Ich hoffe, du hast das Gefühl, dass ich die Integrität deiner Antwort aufrechterhalten habe in meinem. - Bruno Bronosky
Fühlen Sie sich frei zu bearbeiten oder zu hacken; alles, was es für dich besser macht (deshalb habe ich MIT-Lizenz hinzugefügt! Ich brauche nicht einmal einen Kredit.) - Alexx Roche


Dies ist eine Erweiterung für Alexx Roche's ausgezeichnete Antwort. Ich habe versucht, diese Antwort zu bearbeiten, aber es wurde abgelehnt (Aber nicht von Alexx)


Ich habe versucht herauszufinden, was installiert ist which auf meinem System. Nach ein wenig Arbeit habe ich erstellt /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}"

Obwohl für die meisten THINGs, die installiert sind, können Sie einfach verwenden:

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

Für THINGs, die nicht installiert sind, können Sie Folgendes verwenden:

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

Das apt-whatprovides Skript funktioniert für Dateien, die sich auf Ihrem System befinden und nicht. Zum Beispiel fehlte mein System dig aber hatte ping so das es was ergab:

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

Beachte das Searching for ist ein vollständiger Pfad für ping (installiert) und nur der binäre Name für dig nicht installiert. Dies half mir zu entdecken, dass ich installieren musste dnsutilsohne zu suchen gehen https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



Das ist so eine gute Antwort, dass ich meine löschen sollte! - Alexx Roche


Ein Grund, warum Sie dies tun müssen, ist, wenn Sie Software kompilieren, die bereits ein Ubuntu-Paket enthält, können Sie ausführen apt-get build-dep $PACKAGENAME. Dadurch werden alle Pakete installiert, die Sie kompilieren müssen $PACKAGENAME.


1
2017-08-11 19:31