Como listar arquivos de um pacote Debian sem instalar

284

Este comando pode listar apenas o conteúdo dos pacotes instalados,

dpkg -L PACKAGENAME

mas como listar o conteúdo de um pacote não instalado, para visualizar / examinar o pacote?

Xiè Jìléi
fonte
Semelhante no Ubuntu: askubuntu.com/questions/32507/…
Ciro Santilli escreveu:

Respostas:

340

dpkg -c(ou --contents) lista o conteúdo de um arquivo de pacote .deb (é um front-end para dpkg-deb.)

dpkg -c package_file.deb

Para trabalhar diretamente com nomes de pacotes, em vez de arquivos de pacote, você pode usar apt-file. (Pode ser necessário instalar o apt-filepacote primeiro.)

sudo apt-file update        
apt-file list package_name

Conforme declarado no primeiro comentário, o apt-file lista o conteúdo dos pacotes nos repositórios do Apt já configurados. É irrelevante se algum pacote específico está ou não instalado.

alfplayer
fonte
17
O arquivo apt também precisa ser atualizado ( sudo apt-file update) e lista apenas o conteúdo dos pacotes nos seus repositórios Apt já configurados.
quack quixote
1
@quackquixote: No Ubuntu 12.04 é automático
confiq
1
dpkg -clegais!
precisa
2
A resposta do arquivo Apt pressupõe que seu pacote é proveniente de um repositório configurado em vez de um .debarquivo que você baixou separadamente. A questão original é ambígua.
Zoredache
5
@confiq, não pelos meus testes. Estou executando o 12.04.4 e ele ainda diz "E: O cache está vazio. Você precisa executar a 'atualização do arquivo apt' primeiro".
Matthew Flaschen
58

Use em --contentsvez de -L:

dpkg --contents PACKAGENAME

Quando usado dessa maneira, dpkgatua como um front-end para dpkg-deb, portanto, use man dpkg-debpara ver todas as opções.

Você também pode usar um navegador de arquivamento para visualizar o conteúdo do pacote.

charlatão quixote
fonte
2
Isso não funciona, a menos que eu o instalei primeiro e depois o desinstale.
Xiè Jìléi
3
deve funcionar bem se você der um arquivo .deb como argumento (em vez de PACKAGENAME, dê PACKAGE-DEB-FILE).
quack quixote
3
Esta resposta está errada. Você precisa instalar o pacote primeiro. Se você não o instalou, não possui um arquivo .deb.
Neil
Este comando funciona para mim. Por exemplo, baixei o google-chrome-stable_current_amd64.deb do Google. Em seguida, emitiu o comando: dpkg --contents google-chrome-stable_current_amd64.debe listou todos os arquivos que ele instalará (principalmente para /opt/google/chrome), nenhum dos quais está atualmente instalado no meu sistema enquanto digito isso. (Eu estou correndo Xubuntu 11.10 se o que importa.)
quux00
10
@ Neil, a resposta não está errada. Só porque você tem um arquivo deb, não significa que ele está instalado. O apt-file precisa de todo o pacote essencial para compilação. OO
d -_- b
21

dpkg --contentspermitirá que você veja o pacote desinstalado. Se o .deb ainda não estiver em seu sistema, faça

apt-get --download-only install pkgname

O pacote será baixado para, /var/cache/apt/archivesmas não instalado.

Rudedog
fonte
3
Posso apenas listar o conteúdo sem fazer o download? Se eu estiver com uma conexão muito lenta e se o pacote for muito grande para baixar. Se o arquivo .deb tiver um cabeçalho para a lista de conteúdo, acho que o download do pacote inteiro talvez não seja necessário. Isso é possível?
Xiè Jìléi
13

A melhor maneira seria navegar diretamente no repositório de pacotes:

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

Exemplo:

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

baldoz
fonte
E para evitar sair do terminal, você pode usar, por exemplo lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(desde que você tenha lynxinstalado).
Ruslan
8

Tomei @ ideia http do baldoz e generalizou-lo para o Ubuntu e Debian, acrescentou um pouco sede envolveu-o em uma função bash-liner:

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

A mesma função em várias linhas:

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 retorna "Ubuntu" ou "Debian" substituindo-o pelo URL base https://packages.ubuntu.comouhttps://packages.debian.org
  2. lsb_Release -sc retorna o nome do código (por exemplo, "confiável", "sid" etc.) que o utiliza para criar a URL completa: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. Busque esse URL com curl e passe o html por três comandos sed. Primeiro captura apenas a lista de arquivos (o que há entre <pre>e </pre>tags); o segundo remove quaisquer tags html; terceiro remove todas as linhas em branco.

Nota: Ele não pesquisa PPAs, repositórios alternativos de fontes apt e consulta apenas pacotes oficiais disponíveis para o lançamento do debian / ubuntu que você está executando.

notpeter
fonte
Preciso de ruby ​​para executá-lo?
Anwar
1
@ Anwar, eu tinha usado inicialmente o Ruby porque era preguiçoso e as expressões regulares multilinhas sugam sed / awk / grep. Mas eu o reescrevi para usar dois comandos sed, não é necessário Ruby.
notpeter
Agradável! Esta é a resposta que eu estava procurando
Anwar
4

Para todas as pessoas que ainda podem pesquisar no Google esta questão em janeiro de 2017, você pode ter algumas coisas interessantes com versões recentes do apt e dpkg no Debian 8.5 sem baixar nada.

Listar o conteúdo do arquivo Deb sem download:

Primeiro localize o URL completo do arquivo 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: --print-uris switch imprime o URL do pacote deb, mas o deb não é baixado.

Em seguida, exiba o conteúdo do pacote deb sem fazer o download:

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: O mesmo resultado pode ser alcançado com

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

Extraia um arquivo do pacote deb acima, sem download.
Por exemplo, queremos ler a página de manual do pacote yade sem instalar este pacote e nem mesmo fazer o download do pacote deb.

O nome do arquivo da página de manual no pacote deb, conforme recomendado por, dpkg -cé./usr/share/man/man1/yade.1.gz

Para ler a página do manual em tempo real:

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

A página man é exibida corretamente usando o aplicativo man.

PS: Os tubos acima não funcionam com o 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
fonte
Esta descrição funciona para sistemas que usam apenas "apt" e não têm os comandos "apt-x" mais antigos disponíveis!
Jon Watte
2

Experimentar:

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

Parece que não é possível antes de instalá-lo primeiro ou extrair a lista do .debarquivo.

Tente o seguinte comando:

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

Mude language-pack-encom o nome do seu pacote.

Ele basicamente lê o .debarquivo extraído via curle executado dpkg --contents FILEnele.


Você também pode verificar o conteúdo sem baixar o arquivo do pacote.

Portanto, se você souber a URL do .debarquivo, o seguinte comando shell listará todos os arquivos do pacote:

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

Params de ondulação: -s- silencioso, -L- siga os links movidos.

Se você não conhece o URL, busque por:, por apt --print-urisexemplo

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