somente arquivos da lista tar

16

Curiosidade: Se você usa o Archive Manager e extrai um .tar.gz para desmarcar a opção "Manter a estrutura de diretórios", obterá uma tarbomb .

tar -ztflista todos os arquivos e diretórios em um arquivo tar. Existe uma maneira de listar todos os arquivos em um arquivo tar, sem a estrutura de diretórios?

Eero Aaltonen
fonte
Você pode obter o efeito 'tarbomb' com tar xvzf my_tar.tar.gz --transform 's/.*\///'. Mas, infelizmente, isso não muda a forma como é exibido em uma listagem em tvez de x.
ire_and_curses
4
O que me incomoda é que mesmo arquivos bem estruturados podem ser usados ​​com tanta facilidade para criar armas de extração em massa.
Eero Aaltonen

Respostas:

17

Não vejo uma maneira de fazer isso na página de manual, mas você sempre pode filtrar os resultados. O seguinte não assume novas linhas nos nomes dos arquivos:

tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'

Como funciona

Ao definir o separador de campos como /, o último campo awksabe sobre ( $NF) é o nome do arquivo se estiver processando um nome de arquivo ou vazio se estiver processando um nome de diretório ( taradiciona uma barra final aos nomes de diretório). Então, estamos dizendo awkpara imprimir o último campo, se não estiver vazio.

Joseph R.
fonte
Trabalho agradável bonita com awk :)
Eero Aaltonen
5

Utilizando uma sugestão de Joseph R. pode usar o regex [^/]$para greppara os arquivos, procurando por linhas não terminando com /.

tar tzf archive.tar.gz | grep -e "[^/]$"

user116835
fonte
Isso ainda gera, foo/barem oposição a apenas bar. Você quer grep -Eo '[^/]+$'(com GNU grep).
Stéphane Chazelas
4

Supondo que nenhum dos nomes de arquivo contenha novas linhas:

tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'

O primeiro comando sed remove tudo antes do último /em uma linha, para que apenas a parte do nome do arquivo seja impressa. O segundo comando exclui as linhas que agora estão vazias, ou seja, as linhas que terminam em a /, que são diretórios.

Gilles 'SO- parar de ser mau'
fonte
expressão sed: -e # 2, caractere 2: comando desconhecido: `/ 'e a sintaxe sed não parece muito .. intuitiva
Eero Aaltonen
@EeroAaltonen Corrigi o comando sed. De fato, a sintaxe é um tanto enigmática (eu incluo explicações na minha resposta).
Gilles 'SO- stop be evil'
2

Com pax(o comando POSIX para ler tararquivos):

pax -'s@.*/@@' < file.tar

(que lista todos os arquivos, independentemente de seu tipo, incluindo diretórios).

Stéphane Chazelas
fonte