Question Comment trouver le package qui fournit un fichier?


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, me dit quel paquet l'a mise? En supposant que le fichier provient bien d’un paquet, c’est-à-dire.

Question bonus: que se passe-t-il si un fichier n'est pas installé sur mon système? Y a-t-il, par exemple, un site Web qui me permettra de rechercher un fichier et de voir quels paquets, le cas échéant, le fournissent?


381
2017-07-30 08:10


origine


Je me suis toujours demandé ce que je faisais - je sais avec YUM que vous pouvez faire ce que fournit <filepath> / <filename> mais je n'ai jamais trouvé d'alternative à Aptitude autre que le site Web Packages - Marco Ceppi♦
Même sur SU: superuser.com/questions/10997/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Aucune des réponses ne couvre réellement la Provides: mécanisme. Plus en détail, une commande comme mailx ou sendmail n'est pas inclus en tant que binaire tout paquet; au lieu de cela, divers paquets installent leurs propres binaires et en rendent certains disponibles sous un nom "canonique" via /etc/alternatives. Voir également askubuntu.com/questions/366135/… - tripleee


Réponses:


Vous pouvez utiliser dpkg commande pour savoir quel paquet installé possède un fichier:

De man dpkg:

-S, --recherche de nom de fichier-motif de recherche ...
                  Recherchez 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 simplement avec le nom de fichier.

Si vous souhaitez rechercher des fichiers non encore installés sur votre ordinateur, vous pouvez utiliser le Recherche de paquets Ubuntu


359
2017-07-30 08:42



Je recommande fortement d'utiliser dlocate, qui est mis à jour quotidiennement pour des recherches plus rapides. - Daniel T Chen
Astuce: si vous ne connaissez pas le chemin complet, mais uniquement le nom de la commande, utilisez which pour le trouver programme: dpkg -S `which firefox` - Lekensteyn
Cela fonctionne également pour les bibliothèques, ce qui est particulièrement pratique si vous avez un fichier binaire qui ne s'exécutera pas car vous pouvez l'inspecter avec ldd et utiliser les chemins de bibliothèque complets pour trouver les paquets qui vous manquent. - Alain O'Dea
@DanielTChen, mais dlocate peut ne pas faire le travail, si la base de données de dlocate est obsolète. Vous devez appeler sudo update-dlocatedb pour le mettre à jour - jarno
Si dpkg le chemin exact ne renvoie rien (par ex. dpkg /usr/bin/java), essayez simplement le nom de l'exécutable (par ex. dpkg java). - Dan Dascalescu


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

À installer apt-file, faire:

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 Recherche de paquets Ubuntu site Internet. Ils ont la possibilité de "rechercher le contenu des paquets" pour un nom de fichier spécifique.


187
2017-08-11 02:43



À mon avis, cela devrait être la réponse acceptée. Mais en réponse à Recherche de paquets UbuntuJe dirais qu'un programme shell aussi simple est extrêmement convivial et facile à retenir (une fois que vous le connaissez). Si vous utilisez dpkg, apt-get ou aptitude comme outils standard, il n'y a rien de sympathique à faire fonctionner Chrome pour surfer sur Internet! - user2097818
@ 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 installés. apt-file trouve souvent des faux positifs, c'est-à-dire des packages qui ne sont pas installés. Bien sûr, cette réponse est idéale pour la "question bonus". - David Z
Pour ceux du monde Redhat - apt-file search <> est l'analogue le plus proche de dnf/yum whatprovides <>. - ffledgling


Il y a aussi apt-file pour rechercher des fichiers dans des paquets qui ne sont pas installés. Par exemple:

apt-file list packagename

35
2017-07-30 08:49



exactement ce que je cherchais. Merci - NES


Vous pouvez rechercher le contenu des paquets inclus dans les différentes versions d’Ubuntu Paquets Ubuntu site Internet. Regardez sous le titre "Rechercher 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


16
2017-08-11 02:42





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

En 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

En 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.

enter image description here

Exemple

enter image description here


10
2017-11-29 15:57



Vous voulez dire quel paquet et pas quelle application. L'application est votre gestionnaire de paquets, par ex. Centre de logiciels D'accord. Je vous remercie! :) - ReyKev
Merci pour votre aide! Aucune de ces suggestions ne m'a aidé à trouver quel package a installé cette / ces applications. Toutes les recherches renvoient simplement à "Tracker". Je soupçonnais que c'était la canopée d'Enthoughts. Ce long EULA m'a rappelé mon vieux Microsoft Windows Daze, avec lequel je suis si heureux de ne plus être impliqué. J'ai vu que Tracker a été installé hier, donc, en tant que root, je me suis débarrassé de celui-ci, ainsi que de la publication Enthoughts 'Canopy et tous les problèmes sont résolus. Je vous remercie vraiment pour votre aide. Avoir un tel soutien est une si bonne chose. Merci encore! Kevin - ReyKev


J'essayais de retrouver ce qui était installé which sur mon système. Après un petit 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 que vous pouvez simplement utiliser

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

2
2018-03-17 15:25



Alexx, j'adore cette réponse. J'espère que mon travail ne vous dérange pas. Je l'ai également fait 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 créera ma propre réponse si vous la retournez / la rejetez. - Bruno Bronosky
Mise à jour: Il est visqueux de copier les pâtes dans cette réponse et d'y apporter des modifications subtiles, mais mon édition a été rejetée. J'espère que vous sentez que j'ai maintenu l'intégrité de votre réponse dans le mien. - Bruno Bronosky
N'hésitez pas à modifier ou à pirater; tout ce qui le rend meilleur pour vous, c'est pourquoi j'ai ajouté la licence MIT! Je n'ai même pas besoin de crédit. - Alexx Roche


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


J'essayais de retrouver ce qui était installé which sur mon système. Après un petit travail 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 THING installés, 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-whatprovides Le script fonctionne pour les fichiers qui sont et ne sont pas sur votre système. Par exemple, mon système manquait dig mais avait ping donc c'est ce qui a résulté:

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

Remarquerez que Searching for est un chemin complet pour ping (installé) et juste le nom binaire pour dig pas installé. Cela m'a aidé à découvrir que je devais installer dnsutilssans avoir besoin d'aller chercher https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



C'est une si bonne réponse que je devrais supprimer la mienne! - Alexx Roche


Une des raisons pour lesquelles vous pourriez avoir à le faire est que si vous compilez un logiciel qui contient déjà un package ubuntu, vous pouvez exécuter apt-get build-dep $PACKAGENAME. Cela installera tous les paquets dont vous avez besoin pour compiler $PACKAGENAME.


1
2017-08-11 19:31