extrai um único arquivo do enorme arquivo tgz

13

Eu tenho um arquivo tar enorme (cerca de 500G) e eu não quero extrair apenas um único arquivo a partir dele. No entanto, quando executo tar -xvf file.tgz path/to/file , parece que ainda está carregando todo o conteúdo para a memória e leva mais de uma hora para ser extraído. Eu também tentei usar --exclude=ignore.txt onde ignore.txt é uma lista de padrões em uma tentativa de impedir que ele percorra caminhos fúteis, mas isso não parece funcionar.

Talvez eu não entenda o tar ... Existe uma maneira de extrair rapidamente o arquivo?

    
por Brian 08.10.2013 / 02:28

5 respostas

10

Infelizmente, para descompactar um único membro de .tar.gz archive, você precisa processar todo o arquivo, e não há muito o que fazer para corrigi-lo.

É aqui que .zip (e alguns outros formatos como .rar ) arquivam muito melhor, porque zip format tem diretório central de todos os arquivos contidos nele com deslocamentos diretos apontando para o meio do zip para que os membros do arquivo possam ser rapidamente extraídos sem processar a coisa toda.

Você pode perguntar por que processar .tar.gz é tão lento?

.tar.gz (geralmente abreviado como .tgz ) é simplesmente .tar archive compactado com gzip compressor. gzip é um compressor de streaming que só pode trabalhar com um arquivo. Se você deseja obter qualquer parte do gzip stream, é necessário descompactá-lo como um todo e é isso que realmente o mata por .tar.gz (e por .tar.bz2 , .tar.xz e outros formatos semelhantes com base em .tar ).

O formato

.tar é realmente muito, muito simples. É simplesmente fluxo de arquivo de 512 bytes ou cabeçalhos de diretório (nome, tamanho, etc), cada um seguido pelo conteúdo do arquivo ou do diretório (preenchido para 512 tamanho de bloco com 0 bytes, se necessário). Quando você observar um bloco totalmente nulo 512 para um cabeçalho, isso significa que o final de .tar archive.

Algumas pessoas acham que até .tar membros do arquivo não podem ser acessados rapidamente, mas isso não é bastante verdadeiro. Se o arquivo .tar contiver alguns arquivos grandes, você poderá procurar rapidamente o próximo cabeçalho, e assim você poderá encontrar o membro do arquivo necessário em poucas pesquisas (mas ainda pode exigir tantas buscas quantas forem os membros do arquivo). Se o seu arquivo .tar contiver muitos arquivos minúsculos, isso significa que a recuperação rápida de membros torna-se efetivamente impossível mesmo para .tar não compactados.

    
por 08.10.2013 / 06:18
4

Se você está extraindo apenas um arquivo de um arquivo tar grande, você está usando o GNU tar , e você pode garantir que o arquivo tar nunca foi anexado a , então você pode obter um aumento significativo no desempenho usando --occurrence .

Esta opção diz ao tar para parar assim que encontrar a primeira ocorrência de cada arquivo solicitado, por exemplo,

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

não fará spool durante todo o tarball depois que encontrar uma cópia de cada passwd e shadow , em vez disso, parará. Se esses arquivos aparecerem perto do final, o ganho de desempenho não será muito grande, mas se eles aparecerem na metade de um arquivo 500G, você economizará muito tempo.

Para pessoas que usam tar para backups simples e não usam unidades de fita reais, essa situação é provavelmente o caso típico.

Observe que você também pode passar --occurrence=NUMBER para recuperar a NUMBERª ocorrência de cada arquivo, o que ajuda se você souber que existem várias versões do arquivo. Por padrão, o comportamento é igual a NUMBER de 1.

    
por 19.04.2017 / 21:30
1

Infelizmente, o formato do arquivo tar não contém um índice centralizado - portanto, o arquivo deve ser lido em seqüência para localizar um arquivo específico. Ele foi originalmente projetado para backups em fita (o "tar" vem do t ape ar chive), que não suportaria tal operação em nenhum caso.

Então, você provavelmente terá que esperar.

    
por 08.10.2013 / 02:34
0

Aqui estão meus 2cents:

gunzip < remix-v2.0-20170105-pine64-64GB.img.gz > remix-v2.0-20170105-pine64-64GB.img
gunzip < Bliss-pine64_a64+_20170919.img.gz > Bliss-pine64_a64+_20170919.img

Você ainda receberá gzip: stdout: File too large na linha de comando, mas o img será extraído corretamente ....

    
por 02.04.2018 / 15:00
0

Ao lidar com um uso de tarball grande:

--fast-read to extract only the first archive entry that matches filename operand, path/to/file in this case - which is always unique in tarball anyway

tar -xvf file.tgz --fast-read path/to/file

os itens acima pesquisarão até encontrar uma correspondência e, em seguida, sairão

    
por 13.07.2018 / 09:42

Tags