Comment trouver le paquet qui fournit un fichier?

468

Question assez simple: existe-t-il une commande shell (ou une méthode graphique) que je peux utiliser, étant donné le chemin d'accès à un fichier sur mon système, il me dit quel paquet y est placé? En supposant que le fichier provient en fait d'un package, c'est-à-dire.

Question bonus: que se passe-t-il s'il s'agit d'un fichier qui n'est pas installé sur mon système? Existe-t-il, disons, un site Web qui me permettra de rechercher un fichier et de voir quels paquets, le cas échéant, le fournissent?

David Z
la source
6
Je me suis toujours posé la question moi-même. Je sais qu'avec YUM, vous pouvez faire ce qui est fourni avec <chemin du fichier> / <nom du fichier>, mais je n'ai jamais vraiment trouvé d'alternative à celle proposée par Aptitude, à part le site Packages
Marco Ceppi.
Idem sur SU: superuser.com/questions/10997/…
Ciro Santilli a commencé à jouer
Aucune des réponses ici ne couvre réellement le Provides:mécanisme. De manière plus détaillée, une commande comme mailxou sendmailn’est pas incluse en tant que binaire dans n’importe quel paquet; Au lieu de cela, divers paquets installent leurs propres fichiers binaires et en rendent certains disponibles sous un nom "canonique" via /etc/alternatives. Voir aussi askubuntu.com/questions/366135/…
triple-

Réponses:

439

Vous pouvez utiliser la dpkgcommande pour savoir quel paquet installé possède un fichier:

De man dpkg:

-S, --search filename-search-pattern ...
                  Rechercher un nom de fichier à partir des packages installés.

Exemple:

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

Vous pouvez effectuer une recherche avec un chemin complet ou uniquement avec le nom du fichier.

Si vous souhaitez rechercher des fichiers non encore installés sur votre ordinateur, vous pouvez utiliser l' outil de recherche de paquets Ubuntu.

Ressu
la source
5
Je recommande fortement d'utiliser dlocate, qui est mis à jour quotidiennement pour des recherches plus rapides.
Daniel T Chen
20
Astuce: si vous ne connaissez pas le chemin complet, mais juste le nom de la commande, utilisez whichpour trouver le programme:dpkg -S `which firefox`
Lekensteyn
1
@DanielTChen, mais dlocatene peut pas faire le travail, si la base de données de dlocate est obsolète. Vous devez appeler sudo update-dlocatedbpour le mettre à jour.
jarno
2
Si dpkgle chemin exact ne renvoie rien (par exemple dpkg /usr/bin/java), essayez simplement le nom de l'exécutable (par exemple dpkg java).
Dan Dascalescu
2
Vous pouvez également utiliser realpathpour résoudre des liens symboliques, comme ceci: dpkg -S $(realpath $(which <command>)).
Lars Nyström le
238

La apt-filecommande peut le faire pour vous à partir de la ligne de commande. Je l'utilise fréquemment lors de la construction de paquets à partir des sources. Pour les fichiers fournis par les packages déjà installés sur votre système, apt-cachec'est un autre choix.

Pour installer apt-file, faites:

sudo apt-get install apt-file

Ensuite, vous devez mettre à jour sa base de données:

apt-file update

Et, enfin, recherchez le fichier:

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

Cependant, une manière beaucoup plus conviviale consiste à utiliser le site Web Ubuntu Packages Search . Ils ont une option pour "rechercher le contenu des paquets" pour un nom de fichier spécifique.

cravate
la source
21
À mon avis, cela devrait être la réponse acceptée. Mais en réponse à Ubuntu Packages Search , je pourrais dire qu'un programme shell aussi simple est extrêmement convivial et facile à mémoriser (une fois que vous le connaissez). Si vous utilisez dpkg, apt-get ou aptitude comme outils standard, il n’est pas utile de lancer Chrome pour surfer sur Internet!
user2097818
3
@ user2097818 La raison pour laquelle ce n'est pas la réponse acceptée est que ma question principale est limitée aux fichiers du système et aux packages qui sont installés. apt-filetrouve souvent des faux positifs, c'est-à-dire des paquets qui ne sont pas installés. Bien sûr, cette réponse est excellente pour la "question de bonus".
David Z
3
Pour ceux de la partie Redhat du monde - apt-file search <>est l'analogue le plus proche de dnf/yum whatprovides <>.
trafiquer le
J'Aliased apt-file findcomme apt-findil y a longtemps et il est vraiment à portée de main! Btw, les dernières versions nécessitent root pour apt-file update.
val
43

Il existe également apt-file pour rechercher des fichiers dans des packages qui ne sont pas installés. Par exemple:

apt-file list packagename
ptman
la source
17

Vous pouvez rechercher le contenu des paquets inclus dans les différentes versions d'Ubuntu sur le site Web de paquets Ubuntu . Regardez sous la rubrique " Rechercher dans le contenu des paquets ".

Par exemple, voici les résultats de la recherche pour libnss3.so dans lucid (10.04):

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

Moberley
la source
Cela ne fait que renvoyer une erreur récemment.
Pawel Veselov
13

Vous voulez dire quel paquet et pas quelle application. L'application est votre gestionnaire de paquets, par exemple Software Center.

Utilisant dpkg:

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

Exemple

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

Utilisant apt-file:

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

ou aussi possible:

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

Exemple

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

Ou en ligne ici , dans la section Search the contents of packages.

entrez la description de l'image ici

Exemple

entrez la description de l'image ici

UN B
la source
Vous voulez dire quel paquet et pas quelle application. L'application est votre gestionnaire de paquets, par exemple le centre logiciel. D'accord. Je vous remercie! :)
ReyKev
Merci pour votre aide! Aucune de ces suggestions ne m'a aidé à trouver quel paquet a installé cette / ces applications cependant. Toutes les recherches mènent simplement à "Tracker". Je soupçonnais cependant que c’était la canopée d’Earths. Ce contrat de licence de plusieurs mois m'a rappelé mon vieil étourdissement sous Microsoft Windows, avec lequel je suis tellement heureux de ne plus être impliqué. J'ai vu que Tracker avait été installé hier alors, en tant que racine, je m'en suis débarrassé, ainsi que Canopy et tous les problèmes sont résolus. Je vous remercie vraiment pour toute votre aide. C'est une si bonne chose d'avoir un tel soutien. Merci encore! Kevin
ReyKev
4

Ceci est une extension de l'excellente réponse d' Alexx Roche . J'ai essayé de modifier cette réponse, mais elle a été rejetée (mais pas par Alexx).


J'essayais de localiser ce qui était installé whichsur mon système. Après un petit travail que j'ai créé/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}"

Bien que pour la plupart des choses installées, vous pouvez simplement utiliser:

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

Pour les choses qui ne sont pas installées, vous pouvez utiliser:

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

Le apt-whatprovidesscript fonctionne pour les fichiers qui sont et ne sont pas sur votre système. Par exemple, mon système manquait, digmais il en était pingainsi:

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

Notez que Searching forc'est un chemin complet pour ping(installé) et juste le nom binaire pour dignon installé. Cela m'a aidé à découvrir que je devais installer dnsutilssans avoir à rechercher dans https://packages.ubuntu.com/#search_contents

Bruno Bronosky
la source
C'est une si bonne réponse que je devrais supprimer le mien!
Alexx Roche
3

J'essayais de localiser ce qui était installé whichsur mon système. Après un peu de travail j'ai créé apt-whatprovides

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

Bien que pour la plupart des choses, vous pouvez simplement utiliser

apt-file search $(realpath $(which THING))|grep 'THING$'
Alexx Roche
la source
1
Alexx, j'adore cette réponse. J'espère que ça ne vous dérange pas mon montage. Je l'ai fait aussi fonctionner pour les fichiers qui ne sont pas installés sur le système. J'ai fait une sauvegarde sur gist.github.com/RichardBronosky/… et je créerai ma propre réponse si vous la retournez / la refusez.
Bruno Bronosky
Mise à jour: Il est facile de copier cette réponse pour les pâtes et d'y apporter des modifications subtiles, mais ma modification a été rejetée. J'espère que vous sentez que j'ai maintenu l'intégrité de votre réponse dans la mienne .
Bruno Bronosky
N'hésitez pas à éditer ou à pirater; tout ce qui le rend meilleur pour vous, (c'est pourquoi j'ai ajouté une licence MIT! Je n'ai même pas besoin de crédit.)
Alexx Roche
2

Si vous compilez un logiciel qui contient déjà un paquet Ubuntu, vous pouvez le faire, par exemple apt-get build-dep $PACKAGENAME. Cela installera tous les paquets que vous devez compiler $PACKAGENAME.

Rory
la source