Comment lister les fichiers d'un paquet Debian sans les installer

284

Cette commande ne peut lister que le contenu des packages installés,

dpkg -L PACKAGENAME

mais comment lister le contenu d'un paquet non installé, prévisualiser / examiner le paquet?

Xiè Jìléi
la source
Similaire sur Ubuntu: askubuntu.com/questions/32507/…
Ciro Santilli

Réponses:

340

dpkg -c(ou --contents) répertorie le contenu d'un fichier de package .deb (il s'agit d'un frontal pour dpkg-deb.)

dpkg -c package_file.deb

Pour travailler directement avec les noms de paquet plutôt que les fichiers de paquet, vous pouvez utiliser apt-file. (Vous devrez peut-être d'abord installer le apt-filepaquet.)

sudo apt-file update        
apt-file list package_name

Comme indiqué dans le premier commentaire, apt-file répertorie le contenu des packages de vos référentiels Apt déjà configurés. Peu importe qu'un paquet particulier soit installé ou non.

alfplayer
la source
17
apt-file doit également être mis à jour ( sudo apt-file update), et ne répertorie que le contenu des packages de vos référentiels Apt déjà configurés.
Quack Quichotte
1
@quackquixote: Dans Ubuntu 12.04, c'est automatique
confiq,
1
dpkg -cagréable!
d -_- b
2
La réponse Apt-file suppose que votre paquet provient d'un référentiel configuré au lieu d'un .debfichier que vous avez téléchargé séparément. La question initiale est toutefois ambiguë.
Zoredache
5
@confiq, pas par mes tests. Je suis sous 12.04.4 et il est toujours écrit "E: Le cache est vide. Vous devez d'abord lancer 'apt-file update'."
Matthew Flaschen
58

Utilisez --contentsau lieu de -L:

dpkg --contents PACKAGENAME

Utilisé de cette manière, il dpkgsert de front-end dpkg-deb, utilisez donc man dpkg-debpour voir toutes les options.

Vous pouvez également utiliser un navigateur d'archives pour afficher le contenu du paquet.

Quack Quack
la source
2
Cela ne fonctionne que si je l'ai d'abord installé puis désinstallé.
Xiè Jìléi
3
cela devrait fonctionner correctement si vous lui donnez un fichier .deb en argument (au lieu de PACKAGENAME, donnez-lui PACKAGE-DEB-FILE).
Quack Quichotte
3
Cette réponse est fausse. Vous devez d'abord installer le paquet. Si vous ne l'avez pas installé, vous ne disposez pas d'un fichier .deb.
Neil
Cette commande fonctionne pour moi. Par exemple, j'ai téléchargé google-chrome-stable_current_amd64.deb de Google. Puis la commande a été émise: dpkg --contents google-chrome-stable_current_amd64.debelle répertorie tous les fichiers à installer (principalement /opt/google/chrome), dont aucun n’est actuellement installé sur mon système au moment où je tape ceci. (J'utilise Xubuntu 11.10 si cela compte.)
quux00
10
@ Neil, la réponse n'est pas fausse. Ce n’est pas parce que vous avez un fichier deb qu’il est installé. apt-file a besoin de l'intégralité du paquet build-essential. OO
d -_ b b
21

dpkg --contentsvous permettra de regarder le paquet désinstallé. Si le .deb n'est pas encore sur votre système, faites

apt-get --download-only install pkgname

Le paquet sera téléchargé /var/cache/apt/archivesmais ne sera pas installé.

Rudedog
la source
3
Puis-je simplement lister le contenu sans le télécharger? Si la connexion est très lente et si le package est trop volumineux pour être téléchargé. Si le fichier .deb a un en-tête de fichier contenant la liste de contenu, je suppose que le téléchargement du package complet n'est peut-être pas nécessaire. Est-ce possible?
Xiè Jìléi
13

Le meilleur moyen serait de parcourir directement le référentiel de paquets:

http://packages.debian.org/[distro name]/all/[package name]/filelist

Exemple:

http://packages.debian.org/wheezy/all/transmission-common/filelist

baldoz
la source
Et pour éviter de quitter le terminal, vous pouvez utiliser par exemple lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(à condition que vous ayez lynxinstallé).
Ruslan
8

J'ai pris l'idée http de @ baldoz et l'ai généralisée pour Ubuntu et Debian, en ai ajouté un peu sedet je l'ai enveloppée dans une ligne unique avec la fonction bash:

function deb_list () { curl -s $(lsb_release -si | sed -e 's Ubuntu https://packages.ubuntu.com ' -e 's Debian https://packages.debian.org ')/$(lsb_release -sc)/all/$1/filelist | sed -n -e '/<pre>/,/<\/pre>/p' | sed -e 's/<[^>]\+>//g' -e '/^$/d'; }

Usage:

$ deb_list curl
/usr/bin/curl
/usr/share/doc/curl/changelog.Debian.gz
/usr/share/doc/curl/copyright
/usr/share/doc/curl/NEWS.Debian.gz
/usr/share/man/man1/curl.1.gz

Même fonction sur plusieurs lignes:

function deb_list () {
    curl -s $(lsb_release -si \
                | sed -e 's Ubuntu https://packages.ubuntu.com ' \
                      -e 's Debian https://packages.debian.org '
              )/$(lsb_release -sc)/all/$1/filelist \
      | sed -n -e '/<pre>/,/<\/pre>/p' \
      | sed -e 's/<[^>]\+>//g' -e '/^$/d';
}

A expliqué:

  1. lsb_release -si retourne "Ubuntu" ou "Debian", remplace-le par l'URL de base https://packages.ubuntu.comouhttps://packages.debian.org
  2. lsb_Release -sc retourne le nom de code (par exemple, "trusty", "sid", etc.) qui permet de construire l'URL complète: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. Récupérez cette URL avec curl et dirigez le code HTML via trois commandes sed. Tout d’abord, ne capture que la liste des fichiers (entre les balises <pre>et </pre>); la seconde supprime les balises HTML; troisième supprime les lignes vides.

Remarque: Il ne recherche pas les PPA, les sources d'apt autres, mais uniquement les paquets officiels disponibles pour la publication de debian / ubuntu que vous utilisez.

notpeter
la source
Ai-je besoin de ruby ​​pour l'exécuter?
Anwar
1
@ Anwar, j'avais d'abord utilisé Ruby parce que j'étais paresseux et que les regex multilignes aspiraient sed / awk / grep. Mais je l'ai réécrit pour utiliser deux commandes sed, pas besoin de Ruby.
notpeter
Agréable! Voici la réponse que je cherchais
Anwar
4

Pour toutes les personnes qui pourraient encore googler ce problème en janvier 2017, vous pouvez avoir des informations intéressantes sur les versions récentes d'apt et de dpkg dans Debian 8.5 sans rien télécharger.

Liste le contenu du fichier Deb sans téléchargement:

Commencez par localiser l'URL complète du fichier deb:

root@debian:apt-get --print-uris download yade
'http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb' yade_2016.06a-7_amd64.deb 1621148 SHA256:26c0d84484a92ae9c2828edaa63243eb764378d79191149970926aa3ec40cdd4

PS: L'option --print-uris affiche l'URL du paquet deb, mais deb n'est pas téléchargé.

Puis affichez le contenu du paquet deb sans le télécharger:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb -c /dev/stdin
drwxr-xr-x root/root         0 2016-12-10 22:18 ./
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/bin/
-rwxr-xr-x root/root     13184 2016-12-10 22:18 ./usr/bin/yade
.........................more files listed bellow ......................

PS: le même résultat peut être obtenu avec

root@debian:dpkg -c <(curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb")

Extrayez un fichier du paquet deb ci-dessus, sans téléchargement.
Par exemple, nous voulons lire la page de manuel du paquet yade sans installer ce paquet et sans même télécharger le paquet deb.

Nom du fichier de page man package intérieur deb comme conseillé par dpkg -cest./usr/share/man/man1/yade.1.gz

Pour lire la page de manuel à la volée:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb --fsys-tarfile /dev/stdin |tar -xO ./usr/share/man/man1/yade.1.gz |man /dev/stdin

La page de manuel s’affiche correctement avec l’application man.

PS: Les tuyaux ci-dessus ne fonctionnent pas avec la commande ar.

root@debian:apt --version --> apt 1.4~beta2 (amd64)
root@debian:dpkg --version --> Debian 'dpkg' package management program version 1.18.18 (amd64).
root@debian:man --version --> man 2.7.6.1
root@debian:tar --version --> tar (GNU tar) 1.29
George Vasiliou
la source
Cette description fonctionne pour les systèmes qui utilisent uniquement "apt" et ne disposent pas des anciennes commandes "apt-x"!
Jon Watte
2

Essayer:

apt-get download packages-name
dpkg --contents *.deb
readanon
la source
1

Il semble que ce n’est pas possible avant de l’installer ou d’extraire la liste du .debfichier.

Essayez la commande suivante:

dpkg --contents <(curl -s $(apt-get install --yes --no-download --reinstall --print-uris language-pack-en | tail -n1 | grep -o "http[^']\+"))

Changez language-pack-enavec le nom de votre paquet.

Il lit essentiellement le .debfichier extrait via curlet s'exécute dpkg --contents FILEdessus.


Vous pouvez également vérifier le contenu sans télécharger le fichier de package.

Donc, si vous connaissez l'URL du .debfichier, la commande suivante va lister tous les fichiers du paquet:

dpkg -c <(curl -sL "http://httpredir.debian.org/debian/pool/main/a/avis/avis_1.2.2-4_all.deb")

Paramètres curl: -s- silencieux, -L- suivez les liens déplacés.

Si vous ne connaissez pas l'URL, chercher par: apt --print-uris, par exemple

apt --print-uris install avis | grep avis
Kenorb
la source