O tar -tvf descompacta o arquivo ou apenas lista os nomes?

9

Eu tenho um tar.gzarquivo de 32 GB. Eu estava tentando extrair pastas específicas, então listei o conteúdo com o seguinte comando para exibir a estrutura dos arquivos:

tar -tvf file.tar.gz > files.txt

Parece levar uma eternidade para listar todos os arquivos. Minha pergunta é que o sinalizador -t extrai os arquivos também? Eu sei que ele não extrai no disco, mas a quantidade de tempo que está demorando me faz pensar se realmente os processa em algum tipo de buffer.

Saif
fonte
11
Você esqueceu a -zopção: tar -tvfz. Similar: O que acontece se você usar o comando tar tvf em vez de tar tvfz?
smci 15/05
3
@smci: É detectado automaticamente, portanto não é realmente esquecido.
Ry-

Respostas:

14

Os arquivos tar.gz não possuem um índice. Ao contrário do zip ou de outros formatos de arquivo, não é trivial nem barato obter uma lista dos arquivos contidos ou de outros metadados. Para mostrar quais arquivos estão contidos no arquivo, o tar realmente precisa descompactar o arquivo e extrair os arquivos, embora, no caso da -topção, faça isso apenas na memória.

Se um padrão comum no seu caso de uso for listar os arquivos contidos em um archive, considere o uso de um formato de archive que pode adicionar um índice de arquivo ao arquivo compactado, por exemplo, zip.

Talvez você também queira dar uma olhada no formato HDF5 para cenários mais complexos.

Medidas

Eu só tinha que fazer algumas medições para provar minha resposta e criar alguns diretórios com muitos arquivos e empacotá-los com ambos, tar czf files#.tgz files#e zip -r files#.zip files#.

Para os testes, executei o comando de descompactação duas vezes e peguei o resultado da segunda execução, para tentar evitar medir a velocidade do disco.

Teste 1

Diretório files1contendo 100.000 arquivos vazios .

$ time tar tzf files1.tgz >/dev/null
tar tzf files1.tgz > /dev/null  0,56s user 0,09s system 184% cpu 0,351 total
$ time unzip -l files1.zip >/dev/null
unzip -l files1.zip > /dev/null  0,30s user 0,34s system 99% cpu 0,649 total

zip é mais lento aqui.

Teste 2

Diretório files2contendo 5.000 arquivos com 512 bytes de dados aleatórios cada.

$ time tar tzf files2.tgz >/dev/null
tar tzf files2.tgz > /dev/null  0,14s user 0,03s system 129% cpu 0,131 total
$ time unzip -l files2.zip >/dev/null
unzip -l files2.zip > /dev/null  0,03s user 0,06s system 98% cpu 0,092 total

Ainda não é convincente, mas o zip é mais rápido desta vez.

Teste 3

Diretório files3contendo 5.000 arquivos com 5kB de dados aleatórios cada.

$ time tar tzf files3.tgz >/dev/null
tar tzf files3.tgz > /dev/null  0,42s user 0,03s system 111% cpu 0,402 total
$ time unzip -l files3.zip >/dev/null
unzip -l files3.zip > /dev/null  0,03s user 0,06s system 99% cpu 0,093 total

Nesse teste, pode-se ver que quanto maiores os arquivos, mais difícil é o tar listá-los.

Conclusão

Para mim, parece que o zip apresenta um pouco de sobrecarga que você notará apenas com muitos arquivos muito pequenos (quase vazios), enquanto que para um grande número de arquivos maiores, ele vence o concurso ao listar os arquivos contidos no arquivo morto.

Sebastian Stark
fonte