Wie finde ich heraus, welches RPM-Paket eine gesuchte Datei enthält?

207

Als Beispiel suche ich eine mod_files.shDatei, die vermutlich mit dem php-develPaket geliefert wird. Ich vermutete, dass yumdie mod_files.shDatei mit dem php-devel x86_64 5.1.6-23.2.el5_3Paket installiert werden würde , aber die Datei scheint nicht auf meinem Dateisystem installiert zu sein.

Wie finde ich heraus, welches Paket eine bestimmte Datei installiert? Ich suche, wo ich das Paket, das möglicherweise die gesuchte Datei enthält, nicht unbedingt bereits lokal heruntergeladen habe.

Ich benutze CentOS 5.

woherheph
quelle
7
superuser.com ___?
Grzegorz Oledzki
@Grzegorz Guter Punkt, ich habe eine Abstimmung abgegeben, um mich zu bewegen.
rjh
Hier ist eine bessere Antwort: unix.stackexchange.com/a/4706/39281
Sam Watkins
1
@SamWatkins diese Antwort funktioniert nur, wenn das Paket, das die gesuchte Datei liefert, bereits auf dem System installiert ist. Wenn das Paket nicht installiert ist (wie im OP angegeben), können Sie es nicht verwenden rpm, sondern müssen es verwenden yum.
rjh

Antworten:

266

Dies ist eine alte Frage, aber die aktuellen Antworten sind falsch :)

Verwenden Sie yum whatprovides mit dem absoluten Pfad zu der gewünschten Datei (die möglicherweise mit einem Platzhalter versehen ist). Beispielsweise:

yum whatprovides '*bin/grep'

Kehrt zurück

grep-2.5.1-55.el5.x86_64 : The GNU versions of grep pattern matching utilities.
Repo        : base
Matched from:
Filename    : /bin/grep

Möglicherweise bevorzugen Sie die Ausgabe und Geschwindigkeit des repoqueryWerkzeugs, die im yum-utilsPaket enthalten sind.

sudo yum install yum-utils
repoquery --whatprovides '*bin/grep'
grep-0:2.5.1-55.el5.x86_64
grep-0:2.5.1-55.el5.x86_64

repoquery kann andere Abfragen ausführen, z. B. das Auflisten von Paketinhalten, Abhängigkeiten, umgekehrten Abhängigkeiten usw.

rjh
quelle
199

So kennen Sie das Paket, das eine bereits installierte Datei besitzt (oder bereitstellt):

rpm -qf myfilename
dj_segfault
quelle
4
Dieser Befehl scheint effizienter zu sein als yum whatprovides - es ist nicht erforderlich, Updates von möglicherweise langsamen Repositorys abzurufen.
80x25
Diese Version funktioniert auch auf nicht auf Redhat basierenden Distributionen, die immer noch
RPMs
5
Es scheint mir rpm -qf <filename>am besten geeignet zu sein, um zu bestimmen, welches Paket eine installierte Anwendung bereitstellt (da es sich möglicherweise von dem unterscheidet, was sich im aktuellen Yum-Repository-Cache befindet), und es yum whatprovides <filename>ist am besten geeignet, um zu bestimmen, welches Paket eine noch zu installierende Anwendung bereitstellt Anwendung. Jeder hat seinen eigenen Zweck.
StockB
Darüber hinaus ist yum whatprovides ...root nur erforderlich, wenn die Anwendung ein Root-Paket ist (dh sich in befindet /sbin). rpm -qf ...Benötigt jedoch auch root, um RPMs von zu lesen /sbin. Daher schlage ich vor, dass die Root-Anforderungen für beide Methoden funktional äquivalent sind.
StockB
1
Wenn Sie diesen Befehl verwenden, beachten Sie bitte, dass Sie den vollständigen Dateipfad + Dateinamen und nicht nur den Dateinamen verwenden müssen.
Ashish
31

Die beliebteste Antwort ist unvollständig:

Da diese Suche im Allgemeinen nur nach Dateien aus installierten Paketen durchgeführt wird, wird yum whatprovides durch Deaktivieren aller externen Repos unglaublich schnell gemacht (das implizite "installierte" Repo kann nicht deaktiviert werden).

yum --disablerepo=* whatprovides <file>
user93374
quelle
4
In diesem Fall sucht das OP jedoch speziell nach einer fehlenden Datei, die nicht auf dem System installiert wurde , selbst nach der Installation eines Pakets, von dem er dachte, dass es es haben würde, sodass er es nicht verwenden kann--disablerepo=*
Randall
4

Sie gehen zu http://www.rpmfind.net und suchen nach der Datei.

Sie erhalten Ergebnisse für viele verschiedene Distributionen und Versionen, aber wahrscheinlich werden auch Fedora und / oder CentOS angezeigt und Sie kennen den Paketnamen, der mit yum installiert werden soll

nr
quelle
Diese Webseite ist offline!
Peter
1
Die Website scheint nicht nach Dateien zu suchen. Nur Paketnamen mit dem Suchbegriff.
JWW
1
@jww Die Suche nach Dateien funktioniert zumindest für mich einwandfrei. Wie in den Dokumenten angegeben, können Sie nach ausführbaren Dateien anhand ihres einzelnen Pfadnamens oder einer beliebigen Datei mit dem absoluten Pfadnamen suchen.
Nr.
4

Das Paket zu finden, wenn Sie mit dem Internet (Repository) verbunden sind, ist jedoch einfach, wenn Sie nur Zugriff auf RPM-Pakete in Redhat oder Centos DVD haben (dies passiert mir häufig, wenn ich einen Server wiederherstellen muss und eine Anwendung benötige). Ich empfehle Verwenden Sie die folgenden Befehle, die völlig unabhängig von Internet und Repositorys sind. (Vermutlich haben Sie viele deinstallierte Pakete auf einer DVD). Angenommen, Sie haben den Paketordner in ~ / cent_os_dvd gemountet und suchen nach einem Paket, das "semanage" bereitstellt. Dann können Sie Folgendes ausführen:

for file in `find ~/cent_os_dvd/ -iname '*.rpm'`;  do rpm -qlp $file |grep '.*bin/semanage';  if [ $? -eq 0 ]; then echo "is in";echo $file  ; fi;  done
Arash
quelle
0

Sie können dies hier genauso tun, aber mit Ihrem Paket. In meinem Fall war eslsb_release

Lauf: yum whatprovides lsb_release

Antwort:

redhat-lsb-core-4.1-24.el7.i686 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-24.el7.x86_64 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-27.el7.i686 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-27.el7.x86_64 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release`

Zum Installieren ausführen: yum install redhat-lsb-core

Der Paketname sollte ohne Nummer und Systemtyp sein, damit Ihr Packager auswählen kann, was für ihn am besten ist.

Watson Kepson
quelle