643 votes

Comment trouver le paquet qui fournit un fichier ?

Question assez simple : existe-t-il une commande Shell (ou une méthode GUI) que je puisse utiliser qui, étant donné le chemin d'un fichier sur mon système, me dise quel paquet l'a mis là ? En supposant que le fichier provienne effectivement d'un paquet, c'est à dire.

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

7 votes

Je me suis toujours posé cette question moi-même - je sais qu'avec YUM vous pouvez faire yum whatprovides <filepath>/<filename> mais je n'ai jamais vraiment trouvé une alternative à cela dans Aptitude autre que le site web Packages

0 votes

Même chose pour SU : superuser.com/questions/10997/

0 votes

Aucune des réponses ici ne couvre réellement le Provides: mécanisme. De manière plus détaillée, une commande comme mailx o sendmail n'est pas inclus en tant que binaire dans tout Au lieu de cela, les différents paquets installent leurs propres binaires et rendent certains d'entre eux disponibles sous un nom "canonique" par l'intermédiaire de l'application /etc/alternatives . Voir aussi askubuntu.com/questions/366135/

5voto

Bruno Bronosky Points 725

Il s'agit d'une extension de L'excellente réponse d'Alexx Roche . J'ai essayé de faire une modification de cette réponse, mais il a été rejeté (mais pas par Alexx)


J'essayais de retrouver ce qui a installé which sur mon système. Après un peu de 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 choses qui sont installées, vous pouvez simplement utiliser :

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

Pour les THING qui ne sont pas installés, vous pouvez utiliser :

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

El apt-whatprovides script fonctionne pour les fichiers qui sont et ne sont pas sur votre système. Par exemple, il manque à mon système dig mais avait ping et c'est ce qui en 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

Remarquez que Searching for est un chemin complet pour ping (installé) et juste le nom binaire pour dig non installé. Cela m'a permis de découvrir que je devais installer dnsutils sans avoir besoin d'aller chercher https://packages.ubuntu.com/#search_contents

0 votes

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

3voto

Alexx Roche Points 253

J'essayais de retrouver ce qui a installé which sur 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$'

1 votes

Alexx, j'adore cette réponse. J'espère que ma modification ne te dérange pas. J'ai fait en sorte que cela fonctionne aussi pour les fichiers qui ne sont pas installés sur le système. J'ai fait une sauvegarde à gist.github.com/RichardBronosky/ et je créerai ma propre réponse si vous l'annulez ou la rejetez.

0 votes

Mise à jour : C'est dégoûtant de copier cette réponse et d'y apporter des changements subtils, mais mon édition a été rejetée. J'espère que vous pensez que j'ai maintenu l'intégrité de votre réponse. dans la mienne .

0 votes

N'hésitez pas à le modifier ou à le pirater ; tout ce qui peut l'améliorer pour vous, (c'est pourquoi j'ai ajouté la licence MIT ! je n'ai même pas besoin de crédit).

2voto

bentsai Points 1886

Une raison pour laquelle vous pourriez avoir à le faire est que si vous compilez un logiciel pour lequel il existe déjà un paquet ubuntu, vous pouvez exécuter apt-get build-dep $PACKAGENAME . Cela installera tous les paquets nécessaires à la compilation. $PACKAGENAME .

2voto

blueray Points 445

Vous pouvez utiliser apt pour le faire.

$ apt contains /bin/ls
coreutils: /bin/ls

La sortie est la même que :

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

1voto

Qinsi Points 567

Pourquoi :

Chaque distro a sa propre méthode, trop de commandes à retenir o()o

Comment :

Une solution universelle : pacapt -Qo file_path

Résultat :

Sur ubuntu :

$ pacapt -Qo /usr/bin/iostat
sysstat: /usr/bin/iostat

Sur centos :

$ pacapt -Qo /usr/bin/iostat
sysstat-10.1.5-19.el7.x86_64

Même peut trouver le chemin lui-même :

$ pacapt -Qo iostat
sysstat: /usr/share/man/man1/iostat.1.gz
sysstat: /usr/bin/cifsiostat
sysstat: /usr/bin/iostat
sysstat: /usr/share/man/man1/cifsiostat.1.gz

Quoi es pacapt :

pacapt est une enveloppe pour de nombreux gestionnaires de paquets.

Installer :

Il suffit de télécharger le scriptportatif :

wget -O $HOME/bin/pacapt https://github.com/icy/pacapt/raw/ng/pacapt

1 votes

Qu'est-ce que c'est ? pacapt " ? Comment peut-on obtenir cela ?

0 votes

@pomsky J'ai mis à jour les informations sur pacapt. Et vous pouvez obtenir pacapt par wget comme décrit dans la réponse.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X