Finden Sie heraus, zu welchem ​​Paket eine Datei in Ubuntu / Debian gehört?

300

Wenn ich an meinem Ubuntu 8.04-System arbeite, fehlt mir häufig ein Programm, eine Manpage oder eine andere Datei. Gibt es eine einfache Möglichkeit, herauszufinden, welches Paket eine bestimmte Datei enthält (ob diese bereits installiert ist oder nicht)? Vielleicht eine obskure Option für apt oder dpkg?

Jay Conrod
quelle
Dasselbe gilt
Ciro Santilli
25
dpkg -S /path/to/filewenn Sie das Paket installiert haben.
Zaz

Antworten:

247
apt-file search filename

oder

apt-file search /path/to/file


Zum Installieren apt-fileverwenden Sie:

sudo apt-get install apt-file

Sie müssen die Datenbank aktualisieren, bevor Sie sie verwenden können:

sudo apt-file update
John T
quelle
7
Zu Ihrer Information: Die apt-Datei scheint von Contents-amd64.gz abzuhängen, die von den Repositorys bereitgestellt werden. Und nicht alle Repos von Drittanbietern bieten diese Datei an.
Jokester
3
Es hat bei mir nicht funktioniert. Ich habe die Datenbank aktualisiert, aber es wird nichts zurückgegeben. dpkg -Sfunktioniert wie unten beschrieben.
Northys
404

(Debian / Ubuntu) Entdecken Sie, zu welchem ​​Paket eine Datei gehört :

dpkg -S /usr/bin/ls

'dpkg -S' stimmt nur mit der Zeichenfolge überein, die Sie angegeben haben. Wenn Sie also 'ls' als Argument verwenden, entspricht dies einer beliebigen Datei aus einem beliebigen Paket, das 'ls' an einer beliebigen Stelle im Dateinamen enthält. Daher ist es normalerweise eine gute Idee, einen absoluten Pfad zu verwenden. Sie können im zweiten Beispiel sehen, dass 12 Tausend Dateien, von denen bekannt ist, dass sie mit dpkg übereinstimmen, der leeren Zeichenfolge 'ls' entsprechen.

splattne
quelle
33
Das ist nur möglich, wenn die Dateien bereits installiert sind
John T.
19
Im Gegensatz dazu apt-filefindet dieses Paket auch eine Datei, wenn es manuell über dpkg -i! Installiert wurde.
Tanius
4
Wenn Sie erhalten dpkg-query: gefunden kein Pfad Anpassungsmuster versuchen dies : dpkg -S "$(readlink -fn "$(which rename)")".
Pablo A
1
Seltsam, das hat bei mir nicht funktioniert: dpkg-query: no path found matching pattern /usr/bin/java, obwohl es eine Datei an ist/usr/bin/java
nnyby
@nnyby Siehe Kommentar von Pablo A
vog
19

packages.debian.org benutze ich immer, um diese Aufgabe zu erledigen. Es ist apt-file überlegen, da es auch Teile von Dateinamen finden kann. Es ist auch mit der Hauptpaketliste verknüpft, in der Beschreibungen, Fehler usw. aufgeführt sind. Alles in allem eine gute Website. Von der Kommandozeile aus nicht so nützlich, aber dennoch recht nützlich.

Aus Gründen der Geschwindigkeit habe ich die URL mit einem Lesezeichen versehen:

http://packages.debian.org/search?searchon=contents&keywords=%s&mode=filename&suite=unstable&arch=any

in Firefox und fügte hinzu, "debfind" als ein Schlüsselwort (klicken Sie auf "mehr" in der Lesezeichen-Manager mit ihm hilighted), so kann ich nur "debfind" eingeben und es wird funktionieren. Sie können "suite" für andere Versionen der Distribution von "instabil" in "stabil" ändern oder testen, wenn Sie möchten.

Jamuraa
quelle
Es funktioniert jedoch nicht mit benutzerdefinierten Repos.
Ctrl-C
Schlechte Wahl in Bezug auf die Automatisierung.
Alexander Shcheblikin
11

Sie können auch dlocate verwenden. Von der Manpage;

$ dlocate [ PATTERN ]
List all records where either the package name or the filename matches PATTERN.
jeremiah
quelle
1
dlocateist auch meine lieblingsmethode, sehr zuverlässig.
Avio
2
@Avio dlocatefindet ein kürzlich installiertes Paket nur, wenn Sie es sudo update-dlocatedbzuerst ausführen . Der Befehl wird automatisch täglich in /etc/cron.daily/dlocate
jarno am
4

Ich fand Wajig ...

wajig whichpackage /path/to/file 

z.B.

wajig whichpackage /etc/apt/sources.list

Wajig ist ein praktisches Kommandozeilen- oder Konsolentool, das all die apt-get, dpkg-Güte enthält, die Sie nie lernen wollten. .

So installieren Sie Wajig:

apt-get install wajig

Dieser Befehl 'whichpackage' selbst hängt von apt-file ab

Sie müssen die Datenbank noch aktualisieren, bevor Sie sie verwenden können: - Ich weiß noch nicht, ob wajig update whixh bei einem apt-get-Update auch den Dateicache aktualisiert, aber ich gehe davon aus, dass dies möglich ist.

sudo wajig update

sudo apt-file update

(und Super Cow, Easter Egss?!)

pete_m
quelle
2

Ähnlich wie Jamuraas Antwort für Debian können Sie auch für Ubuntu http://packages.ubuntu.com/ aufrufen . Sie müssen ein wenig nach unten scrollen, um das Suchfeld "Inhalt von Paketen durchsuchen " zu finden, in dem Sie den Pfad einer Datei eingeben können.

kiri
quelle
Wenn nur Raspbian auch einen hatte :)
XTL
0

Versuchen Sie, mithilfe von http://www.kodkast.com/applications/find-which-package-file-belongs-to nach Dateien zu suchen

Dies ist eine Anwendung, um nach Dateien zu suchen, die in verschiedenen RPM / Linux-Paketen enthalten sind. Sie ist sehr nützlich, wenn Sie nicht einmal die RPM auf Ihrem Computer installiert haben.

Ravi Agarwal
quelle
Downvote: Der Link ist kaputt und der Link scheint in erster Linie für RPM-Pakete zu sein.
Tripleee
0

Das Paket command-not-found gibt Ihnen Hinweise auf mögliche Befehle und den Namen des Debian-Pakets. Es funktioniert, indem Sie den Befehl in die Bash-Shell eingeben und sich die Ausgabe ansehen.

Zum Beispiel, wenn der Befehlsname bekannt ist:

zer@ivy:~ 10:45 $ zsh5
The program 'zsh5' is currently not installed.  To run 'zsh5' please ask
your administrator to install the package 'zsh'
zsh5: command not found

und wenn der Befehl nicht bekannt ist, werden einige Vermutungen angewendet:

zer@ivy:~ 09:46 $ zsh
No command 'zsh' found, did you mean:
 Command 'lsh' from package 'lsh-client' (main)
 Command 'osh' from package 'omake' (main)
 Command 'ysh' from package 'libyaml-shell-perl' (main)
 Command 'ssh' from package 'openssh-client' (main)
 Command 'vsh' from package 'crystalspace' (main)
 Command 'dsh' from package 'dsh' (main)
 Command 'ash' from package 'ash' (main)
 Command 'msh' from package 'nmh' (main)
 Command 'zssh' from package 'zssh' (main)
 Command 'qsh' from package 'gridengine-client' (main)
 Command 'sh' from package 'dash' (main)
 Command 'bsh' from package 'bsh' (main)
zsh: command not found
erwing
quelle
Dies funktioniert jedoch nicht für beliebige Dateien, wie das angeforderte OP.
ein
Dies ist ein problematischer Tipp, wenn das Programm schädliche Dinge tut und installiert ist. Hinzufügen -hoder --helpam Ende würde ein bisschen helfen. Wenn das Hinzufügen -ham Ende dies sicher genug machen würde, würde ich empfehlen, aber trotzdem ist es kein guter Weg, um das zu erreichen, was das OP verlangt.
Dr. Beco