Cómo listar archivos de un paquete Debian sin instalar

284

Este comando solo puede mostrar el contenido de los paquetes instalados,

dpkg -L PACKAGENAME

pero, ¿cómo enumerar el contenido de un paquete no instalado para obtener una vista previa / examinar el paquete?

Xiè Jìléi
fuente
Similar en Ubuntu: askubuntu.com/questions/32507/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

340

dpkg -c(o --contents) enumera el contenido de un archivo de paquete .deb (es un front-end para dpkg-deb).

dpkg -c package_file.deb

Para trabajar directamente con nombres de paquetes en lugar de archivos de paquetes, puede usar apt-file. (Es posible que apt-fileprimero necesite instalar el paquete).

sudo apt-file update        
apt-file list package_name

Como se indicó en el primer comentario, apt-file enumera el contenido de los paquetes en sus repositorios Apt ya configurados. Es irrelevante si algún paquete en particular está o no instalado.

Alfplayer
fuente
17
apt-file también necesita ser actualizado ( sudo apt-file update), y solo enumera el contenido de los paquetes en sus repositorios Apt ya configurados.
quack quijote
1
@quackquixote: en Ubuntu 12.04 es automático
confiq
1
dpkg -c¡bonito!
d -_- b
2
La respuesta del archivo Apt supone que su paquete proviene de un repositorio configurado en lugar de un .debarchivo que ha descargado por separado. Sin embargo, la pregunta original es ambigua.
Zoredache
55
@confiq, no según mis pruebas. Estoy ejecutando 12.04.4 y aún dice "E: el caché está vacío. Primero debes ejecutar 'apt-file update'".
Matthew Flaschen
58

Usar en --contentslugar de -L:

dpkg --contents PACKAGENAME

Cuando se usa de esta manera, dpkgactúa como un front-end para dpkg-deb, así que use man dpkg-debpara ver todas las opciones.

También puede usar un navegador de archivos para ver el contenido del paquete.

quijote curandero
fuente
2
Esto no funciona a menos que lo instale primero y luego lo desinstale.
Xiè Jìléi
3
debería funcionar bien si le das un archivo .deb como argumento (en lugar de PACKAGENAME, dale PACKAGE-DEB-FILE).
quack quijote
3
Esta respuesta es incorrecta. Primero debe tener el paquete instalado. Si no lo tiene instalado, entonces no tiene un archivo .deb.
Neil
Este comando me funciona. Por ejemplo, descargué google-chrome-stable_current_amd64.deb de Google. Luego emitió el comando: dpkg --contents google-chrome-stable_current_amd64.deby enumeró todos los archivos que instalará (principalmente /opt/google/chrome), ninguno de los cuales está instalado actualmente en mi sistema mientras escribo esto. (Estoy ejecutando Xubuntu 11.10 si eso importa).
quux00
10
@Neil, la respuesta no es incorrecta. El hecho de que tenga un archivo deb no significa que esté instalado. apt-file necesita todo el paquete build-essential. OO
d -_- b
21

dpkg --contentsle permitirá ver el paquete desinstalado. Si el .deb aún no está en su sistema, haga

apt-get --download-only install pkgname

El paquete se descargará /var/cache/apt/archivespero no se instalará.

Perro rudo
fuente
3
¿Puedo enumerar el contenido sin descargarlo? Si estoy en una conexión muy lenta, y si el paquete es demasiado grande para descargar. Si el archivo .deb tiene un encabezado de archivo donde va la lista de contenido, supongo que puede que no sea necesario descargar todo el paquete. es posible?
Xiè Jìléi
13

La mejor manera sería navegar directamente por el repositorio de paquetes:

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

Ejemplo:

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

baldoz
fuente
Y para evitar salir del terminal, puede usar, por ejemplo, lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(siempre que haya lynxinstalado).
Ruslan
8

Tomé @ http idea de Baldoz y generalizada que para Ubuntu y Debian, añadí un poco sed, lo envolvió en una función fiesta de una sola línea:

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'; }

Uso:

$ 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

Misma función en múltiples líneas:

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';
}

Explicado:

  1. lsb_release -si devuelve "Ubuntu" o "Debian", reemplácelo con la url base https://packages.ubuntu.comohttps://packages.debian.org
  2. lsb_Release -sc devuelve el nombre en clave (p. ej., "confiable", "sid", etc.) utilícelo para construir la URL completa: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. Obtenga esa URL con curl y canalice el html a través de tres comandos sed. Primero captura solo la lista de archivos (qué hay entre <pre>y </pre>etiquetas); el segundo elimina cualquier etiqueta html; tercero elimina las líneas en blanco.

Nota: No busca PPA, repositorios alternativos de fuentes apt y solo consulta los paquetes oficiales disponibles para el lanzamiento de debian / ubuntu que está ejecutando.

notpeter
fuente
¿Necesito ruby ​​para ejecutarlo?
Anwar
1
@Anwar, inicialmente usé Ruby porque era vago y las expresiones regulares multilínea apestaban en sed / awk / grep. Pero lo he reescrito para usar dos comandos sed, no se requiere Ruby.
notpeter 01 de
¡Agradable! Esta es la respuesta que estaba buscando
Anwar
4

Para todas aquellas personas que aún podrían buscar en Google este problema en enero de 2017, pueden tener algunas cosas interesantes con versiones recientes de apt y dpkg en Debian 8.5 sin descargar nada.

Contenido de la lista del archivo Deb sin descargar:

Primero ubique la url completa del archivo 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

PD: el interruptor --print-uris imprime la url del paquete deb pero deb no se descarga.

Luego muestre el contenido del paquete deb sin descargarlo:

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

PD: Se puede lograr el mismo resultado con

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

Extraiga un archivo del paquete deb anterior, sin descargar.
Por ejemplo, queremos leer la página de manual del paquete yade sin instalar este paquete y sin siquiera descargar el paquete deb.

Nombre de archivo de la página del manual dentro del paquete de Deb según lo aconsejado dpkg -ces./usr/share/man/man1/yade.1.gz

Para leer la página de manual sobre la marcha:

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 página man se muestra correctamente usando la aplicación man.

PD: las tuberías anteriores no funcionan con el comando 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
fuente
¡Esta descripción funciona para sistemas que usan solo "apt" y no tienen disponibles los comandos "apt-x" anteriores!
Jon Watte
2

Tratar:

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

Parece que no es posible antes de instalarlo primero o extraer la lista del .debarchivo.

Pruebe el siguiente comando:

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

Cambiar language-pack-encon el nombre de su paquete.

Básicamente, lee el .debarchivo extraído curly se ejecuta dpkg --contents FILEen él.


También puede verificar el contenido sin descargar el archivo del paquete.

Entonces, si conoce la URL del .debarchivo, el siguiente comando de shell mostrará una lista de todos los archivos del paquete:

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

Parámetros de rizo: -s- silencio, -L- seguir enlaces movidos.

Si no conoce la URL, busque: apt --print-urisp. Ej.

apt --print-uris install avis | grep avis
kenorb
fuente