Wie finde ich das Paket, das eine Datei bereitstellt?

373

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, also.

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, falls vorhanden, diese bereitstellen?

    
David Z 30.07.2010, 10:10

8 Antworten

350

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

Von man dpkg :

-S, --search filename-search-pattern...
                  Search for a filename from installed packages.

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 Suche nach Ubuntu-Paketen

verwenden     
Ressu 30.07.2010, 10:42
181

Der Befehl apt-file kann dies über die Befehlszeile für Sie erledigen. 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, ist apt-cache eine weitere Wahl.

Um apt-file zu installieren, machen Sie:

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

Es ist jedoch viel benutzerfreundlicher, die Ubuntu-Paketsuche zu verwenden. Sie haben die Option, den Inhalt von Paketen nach einem bestimmten Dateinamen zu durchsuchen.

    
jbowtie 11.08.2010 04:43
32

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

apt-file list packagename
    
ptman 30.07.2010 10:49
16

Sie können den Inhalt von Paketen, die in den verschiedenen Ubuntu-Versionen enthalten sind, auf der Ubuntu-Pakete Website durchsuchen. Sehen Sie unter der Überschrift " Inhalt von Paketen durchsuchen ".

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

Pfandrecht

    
moberley 11.08.2010 04:42
10

Sie meinen, welches Paket und nicht welche Anwendung. Die Anwendung ist Ihr Paketmanager, z.B. 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 Abschnitt Search the contents of packages .

Beispiel

    
A.B. 29.11.2015 16:57
2

Ich habe versucht, herauszufinden, was which auf meinem System installiert hat. 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 [email protected]))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

Obwohl Sie für die meisten THINGS einfach

verwenden können
apt-file search $(realpath $(which THING))|grep 'THING$'
    
Alexx Roche 17.03.2018 16:25
2

Dies ist eine Erweiterung zu Alexx Roches exzellenter Antwort . Ich habe versucht, diese Antwort zu bearbeiten, aber wurde abgelehnt (allerdings nicht von Alexx)

Ich habe versucht, herauszufinden, was which auf meinem System installiert hat. Nach ein wenig Arbeit habe ich /usr/local/bin/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 [email protected]) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="[email protected]"
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 Folgendes verwenden:

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

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

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

Das Skript apt-whatprovides funktioniert für Dateien, die sich auf Ihrem System befinden und nicht. Zum Beispiel fehlte meinem System dig , aber ping , so dass dies Folgendes ergab:

[email protected]:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

[email protected]:~ $ 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 Searching for ein vollständiger Pfad für ping (installiert) ist und nur der Binärname für dig nicht installiert ist. Dies half mir zu entdecken, dass ich dnsutils installieren musste, ohne die Suche lien

zu starten     
Bruno Bronosky 18.07.2018 07:45
1

Ein Grund, warum Sie dies tun müssen, ist, dass Sie apt-get build-dep $PACKAGENAME ausführen können, wenn Sie Software kompilieren, für die es bereits ein ubuntu-Paket gibt. Dadurch werden alle Pakete installiert, die Sie zum Kompilieren von $PACKAGENAME benötigen.

    
Rory 11.08.2010 21:31

Tags und Links