Wie finde ich das Paket, das eine Datei bereitstellt?


468

Einfache Frage: Gibt es einen Shell-Befehl (oder eine GUI-Methode), die ich verwenden kann, wenn der Pfad zu einer Datei auf meinem System angegeben ist und mir sagt, welches Paket sie dort abgelegt hat? Vorausgesetzt, 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 beispielsweise eine Website, auf der ich eine Datei nachschlagen und sehen kann, welche Pakete sie gegebenenfalls bereitstellen?


6
Ich habe mich das immer selbst gefragt - ich weiß, dass Sie mit YUM das tun können, was <Dateipfad> / <Dateiname> bietet, aber ich habe in Aptitude nie wirklich eine Alternative gefunden, außer auf der Website von Packages
Marco Ceppi


Keine der Antworten hier deckt tatsächlich den Provides:Mechanismus ab. Genauer gesagt, ein Befehl wie mailxoder sendmailist in keinem Paket als Binärdatei enthalten. Stattdessen installieren verschiedene Pakete ihre eigenen Binärdateien und stellen einige von ihnen unter einem "kanonischen" Namen über zur Verfügung /etc/alternatives. Siehe auch askubuntu.com/questions/366135/…
Tripleee

Antworten:


439

Mit dem dpkgBefehl können Sie herausfinden, welches installierte Paket eine Datei besitzt:

Von man dpkg:

-S, --search filename-search-pattern ...
                  Suchen Sie in installierten Paketen nach einem Dateinamen.

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-Paketsuche verwenden


5
Ich empfehle dringend, dlocate zu verwenden, das täglich aktualisiert wird, um eine schnellere Suche zu ermöglichen.
Daniel T Chen

20
Hinweis: Wenn Sie nicht den vollständigen Pfad kennen, sondern nur den Befehlsnamen, verwenden Sie which, um das Programm zu finden:dpkg -S `which firefox`
Lekensteyn

1
@DanielTChen, erledigt dlocateden Job jedoch möglicherweise nicht, wenn die Datenbank von dlocate nicht mehr aktuell ist. Sie müssen anrufen sudo update-dlocatedb, um es zu aktualisieren.
Jarno

2
Wenn dpkgder genaue Pfad nichts zurückgibt (z. B. dpkg /usr/bin/java), versuchen Sie nur den Namen der ausführbaren Datei (z dpkg java. B. ).
Dan Dascalescu

2
Sie können auch verwendet werden realpath, wie dies Symlinks zu beheben: dpkg -S $(realpath $(which <command>)).
Lars Nyström

236

Der apt-fileBefehl kann dies für Sie über die Befehlszeile ausführen. Ich benutze es häufig, wenn ich Pakete aus dem Quellcode baue. Für Dateien, die von Paketen bereitgestellt werden, die bereits auf Ihrem System installiert sind, apt-cacheist eine andere Wahl.

Gehen Sie zur Installation wie apt-filefolgt vor:

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

Ein viel benutzerfreundlicherer Weg ist jedoch die Verwendung der Ubuntu Packages Search- Website. Sie haben die Möglichkeit, den Inhalt von Paketen nach einem bestimmten Dateinamen zu durchsuchen.


21
Meiner Meinung nach sollte dies die akzeptierte Antwort sein. Als Reaktion auf Ubuntu Packages Search könnte ich jedoch argumentieren, dass ein so einfaches Shell-Programm äußerst benutzerfreundlich und leicht zu merken ist (sobald Sie es wissen). Wenn Sie dpkg, apt-get oder aptitude als Standardtools verwenden, ist das Starten von Chrome für das Surfen im Internet nichts Gutes!
user2097818

3
@ user2097818 Der Grund, warum dies nicht die akzeptierte Antwort ist, ist, dass meine Hauptfrage auf Dateien auf dem System und auf installierte Pakete beschränkt ist. apt-filefindet oft falsch positive, dh Pakete, die nicht installiert sind. Natürlich ist diese Antwort für die "Bonusfrage" großartig.
David Z

3
Für diejenigen von der Redhat-Seite der Welt - apt-file search <>ist das nächste Analogon zu dnf/yum whatprovides <>.
ffledgling

Ich aliased apt-file findwie apt-findschon vor langer Zeit und es ist wirklich praktisch! Übrigens benötigen die neuesten Versionen root für apt-file update.
val

43

Es gibt auch apt-file zum Nachschlagen von Dateien in Paketen, die nicht installiert sind. Zum Beispiel:

apt-file list packagename


13

Sie meinen, welches Paket und nicht welche Anwendung. Die Anwendung ist Ihr Paketmanager, z Software Center.

Verwenden von 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 von 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.

Bildbeschreibung hier eingeben

Beispiel

Bildbeschreibung hier eingeben


Sie meinen, welches Paket und nicht welche Anwendung. Die Anwendung ist Ihr Paketmanager, z. B. Software Center. Okay. Danke! :)
ReyKev

Vielen Dank für all die Hilfe! Keiner dieser Vorschläge hat mir dabei geholfen herauszufinden, welches Paket diese Anwendungen installiert hat. Alle Suchen führen nur zurück zu "Tracker". Ich vermutete allerdings, dass es Enthoughts 'Canopy war. Der kilometerlange EULA erinnerte mich an meine alte Microsoft Windows-Benommenheit, mit der ich so froh bin, dass ich nicht mehr beschäftigt bin. Ich habe gesehen, dass der Tracker gestern installiert wurde, also habe ich ihn als root zusammen mit Enthoughts 'Canopy entfernt und alle Probleme sind gelöst. Ich danke Ihnen sehr für Ihre Hilfe. Es ist großartig, solche Unterstützung zu haben. Danke noch einmal! Kevin
ReyKev

4

Dies ist eine Erweiterung der hervorragenden Antwort von Alexx Roche . Ich habe versucht, diese Antwort zu bearbeiten, sie wurde jedoch abgelehnt (allerdings nicht von Alexx).


Ich habe versucht herauszufinden, was whichauf meinem System installiert ist. 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}"

Für die meisten installierten DINGE können Sie jedoch nur Folgendes verwenden:

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

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

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

Das apt-whatprovidesSkript funktioniert für Dateien, die sich auf Ihrem System befinden und nicht. Zum Beispiel, mein System hat gefehlt, digaber pingso war es, was daraus resultierte:

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

Beachten Sie, dass dies Searching forein vollständiger Pfad für ping(installiert) und nur der Binärname für dignicht installiert ist. Dies hat mir geholfen herauszufinden, dass ich installieren musste, dnsutilsohne https://packages.ubuntu.com/#search_contents durchsuchen zu müssen


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

3

Ich habe versucht herauszufinden, was whichauf meinem System installiert ist. 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, die Sie nur verwenden können

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

1
Alexx, ich liebe diese Antwort. Ich hoffe du hast nichts gegen meine Bearbeitung. Ich habe es auch für Dateien funktionieren lassen, die nicht auf dem System installiert sind. Ich habe unter gist.github.com/RichardBronosky/… ein Backup erstellt und werde meine eigene Antwort erstellen, wenn Sie sie zurücksetzen / ablehnen.
Bruno Bronosky

Update: Es fühlt sich schleimig an, diese Antwort zu kopieren und geringfügige Änderungen daran vorzunehmen, aber meine Bearbeitung wurde abgelehnt. Ich hoffe, Sie haben das Gefühl, ich habe die Integrität Ihrer Antwort in meiner beibehalten .
Bruno Bronosky

Fühlen Sie sich frei zu bearbeiten oder zu hacken; alles, was es besser für Sie macht, (deshalb habe ich MIT-Lizenz hinzugefügt! Ich brauche nicht einmal Kredit.)
Alexx Roche

2

Möglicherweise müssen Sie dies tun, wenn Sie Software kompilieren, für die bereits ein Ubuntu-Paket vorhanden ist, das Sie ausführen können apt-get build-dep $PACKAGENAME. Damit werden alle Pakete installiert, die Sie kompilieren müssen $PACKAGENAME.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.