Questão Como listar arquivos de um pacote Debian sem instalar


Este comando só pode listar 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?


255


origem


Similar no Ubuntu: askubuntu.com/questions/32507/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Respostas:


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

dpkg -c package_file.deb

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

sudo apt-file update        
apt-file list package_name

Como indicado no primeiro comentário, o apt-file lista o conteúdo para pacotes em seus repositórios do Apt já configurados. É irrelevante se algum pacote específico está ou não instalado.


306



apt-file também precisa ser atualizado (sudo apt-file update), e apenas lista conteúdos para pacotes em seus repositórios do Apt já configurados. - quack quixote
@quackquixote: No Ubuntu 12.04 é automático - confiq
dpkg -c bom! - d-_-b
A resposta do Apt-file assume que seu pacote está vindo de um repositório configurado em vez de um .deb arquivo que você baixou separadamente. A questão original é ambígua. - Zoredache
@ Confiq, não pelo meu teste. Estou executando 12.04.4 e ainda diz "E: O cache está vazio. Você precisa executar 'apt-file update' primeiro." - Matthew Flaschen


Usar --contents ao invés de -L:

dpkg --contents PACKAGENAME

Quando usado dessa maneira, dpkg atua como um front-end para dpkg-deb, então use man dpkg-deb para ver todas as opções.

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


53



Isso não funciona a menos que eu o instale primeiro e depois desinstale-o. - Xiè Jìléi
ele deve funcionar bem se você der um arquivo .deb como argumento (em vez de PACKAGENAME, dê a ele PACKAGE-DEB-FILE). - quack quixote
Essa resposta está errada. Você precisa ter o pacote instalado primeiro. Se você não tiver instalado, você não terá um arquivo .deb. - Neil
Este comando funciona para mim. Por exemplo, eu fiz o download do google-chrome-stable_current_amd64.deb do Google. Em seguida, emitiu o comando: dpkg --contents google-chrome-stable_current_amd64.deb e listou todos os arquivos que serão instalados (principalmente para /opt/google/chrome), nenhum dos quais está atualmente instalado no meu sistema enquanto digito isso. (Eu estou executando o Xubuntu 11.10 se isso importa.) - quux00
@ 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 da compilação. OO - d-_-b


dpkg --contents permitirá que você veja o pacote desinstalado. Se o .deb ainda não está no seu sistema, faça

apt-get --download-only install pkgname

O pacote será baixado para /var/cache/apt/archives mas não instalado.


17



Posso apenas listar o conteúdo sem baixá-lo? Se eu estiver em uma conexão muito lenta e se o pacote for muito grande para download. Se o arquivo .deb tiver um cabeçalho de arquivo no qual a lista de conteúdo vai, acho que o download de todo o pacote talvez não seja necessário. Isso é possível? - Xiè Jìléi


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

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

Exemplo:

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


11



E para evitar deixar o terminal, você pode usar, e. lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/ (desde que você tenha lynx instalado). - Ruslan


eu peguei @ idéia http do baldoz e generalizou para o Ubuntu e Debian, adicionou um pouco de sed e envolveu-o em uma função bash one-liner:

function deb_list () { curl -s $(lsb_release -si | sed -e 's Ubuntu http://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

Mesma função em várias linhas:

function deb_list () {
    curl -s $(lsb_release -si \
                | sed -e 's Ubuntu http://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" substitui isso pelo URL base http://packages.ubuntu.com ou https://packages.debian.org
  2. lsb_Release -sc retorna o codinome (por exemplo, "trusty", "sid", etc) use isso para construir o URL completo: http://packages.ubuntu.com/trusty/all/curl/filelist
  3. Busque essa URL com o curl e canalize o html por meio de três comandos sed. Primeiro, captura apenas a lista de arquivos (o que está entre <pre> e </pre> Tag); segundo remove quaisquer tags html; terceiro remove todas as linhas em branco.

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


7



Preciso de rubi para executá-lo? - Anwar
@Anwar, eu inicialmente usei Ruby porque eu era preguiçoso e regexes de múltiplas linhas sugam em sed / awk / grep. Mas eu o reescrevi para usar dois comandos sed, nenhum requerido pelo Ruby. - notpeter
Agradável! Essa é a resposta que eu estava procurando - Anwar


Experimentar:

apt-get download packages-name
dpkg --contents *.deb

2





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

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[^']\+"))

mudança language-pack-en com o nome do seu pacote.

Basicamente lê .deb arquivo extraído via curl e corra dpkg --contents FILE nele.


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

Então, se você souber o URL de .deb arquivo, 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")

Curl params: -s - silencioso -L - siga os links movidos.

Se você não souber o URL, busque por: apt --print-uris, por exemplo.

apt --print-uris install avis | grep avis

1





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

Listar o conteúdo do arquivo Deb sem download: 

Primeiro, localize a URL completa 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 a url do pacote deb mas deb não é baixado.

Em seguida, exiba o conteúdo do pacote deb sem baixá-lo:

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 man do pacote yade sem instalar este pacote e sem baixar o pacote deb.

Nome de arquivo da página man dentro do pacote deb como recomendado por dpkg -c é ./usr/share/man/man1/yade.1.gz

Para ler a página man on the fly:

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: Acima de tubos não funciona 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

1