web-dev-qa-db-fra.com

Comment trouver le paquet 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, 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?

446
David Z

Vous pouvez utiliser la commande dpkg pour savoir quel package installé est propriétaire d'un fichier:

De man dpkg:

 - S, --search filename-search-pattern ... 
 Recherchez un nom de fichier dans les paquets 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 le buntu Packages Search

413
Ressu

La commande apt-file 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-cache est un autre choix.

Pour installer apt-file, procédez comme suit:

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 méthode beaucoup plus conviviale consiste à utiliser le site Web Recherche de paquets Ubunt . Ils ont une option pour "rechercher le contenu des paquets" pour un nom de fichier spécifique.

226
jbowtie

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

apt-file list packagename
43
ptman

Vous pouvez rechercher le contenu des paquets inclus dans les différentes versions d'Ubuntu sur le site Web buntu Packages . Recherchez sous le titre " Rechercher dans le contenu des packages ".

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

17
moberley

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

Utilisation de 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

Utilisation de 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

13
A.B.

Ceci est une extension de 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é 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 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 script apt-whatprovides fonctionne pour les fichiers qui sont et ne sont pas sur votre système. Par exemple, mon système manquait de Dig mais avait ping donc voici 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

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

3
Bruno Bronosky

J'essayais de localiser ce qui était 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$'
3
Alexx Roche

Si vous compilez un logiciel contenant déjà un paquet Ubuntu, vous pouvez exécuter apt-get build-dep $PACKAGENAME. Cela installera tous les paquets dont vous avez besoin pour compiler $PACKAGENAME.

2
Rory