extrair um único arquivo de um enorme arquivo tgz


19

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

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


Eu estou pensando sobre o mesmo. O arquivo que estou procurando é encontrado rapidamente e extraído - e, em seguida, preciso aguardar uma hora para que o restante do alcance seja processado: o (
maasha

Respostas:


14

Infelizmente, para descompactar um único membro do .tar.gzarquivo, é necessário processar o arquivo inteiro e não há muito o que fazer para corrigi-lo.

É aqui que .zip(e alguns outros formatos como .rar) os arquivos funcionam muito melhor, porque o zipformato possui um diretório central de todos os arquivos contidos nele, com deslocamentos diretos apontando para o meio do ziparquivo, para que os membros do arquivo possam ser rapidamente extraídos sem processar tudo.

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

.tar.gz(geralmente abreviado como .tgz) é simplesmente um .tararquivo compactado com gzipcompressor. gzipé um compressor de streaming que só pode funcionar com um arquivo. Se você deseja obter qualquer parte do gzipfluxo, você tem que descompactá-lo como um todo, e isso é o que realmente mata-lo para .tar.gz(e para .tar.bz2, .tar.xze outros formatos semelhantes com base em .tar).

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

Algumas pessoas pensam que mesmo os .tarmembros do arquivo não podem ser acessados ​​rapidamente, mas isso não é bem verdade. Se o .tararchive contiver poucos arquivos grandes, você poderá procurar rapidamente o próximo cabeçalho e, assim, poderá encontrar o membro do archive necessário em poucas buscas (mas ainda poderá exigir tantas buscas quanto os membros do archive). Se o seu .tararquivo contém muitos arquivos pequenos, isso significa que a recuperação rápida de membros se torna efetivamente impossível, mesmo para descompactados .tar.


3
O gzip pode transmitir dados não compactados, não precisa desfazer a coisa toda. Mas, como .tar é a abreviação de arquivo de fita, você precisa percorrer o arquivo inteiro até encontrar o arquivo que está procurando. Embora o tar continue procurando porque pode haver outro, copie mais tarde no arquivo tar.
kurtm

9

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

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

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

não passará por todo o tarball depois de encontrar uma cópia de cada um passwde shadow, em vez disso, parará. Se esses arquivos aparecerem perto do fim, o ganho de desempenho não será muito grande, mas se aparecerem na metade de um arquivo 500G, você economizará muito tempo.

Para pessoas que usam tarbackups de captura única e não usam unidades de fita reais, essa situação é provavelmente o caso típico.

Note que você também pode passar --occurrence=NUMBERpara recuperar a ocorrência NUMBERth de cada arquivo, o que ajuda se você sabe que lá estão várias versões do arquivo. Por padrão, o comportamento é igual a NUMBER1.


Existe uma maneira de criar o tar para que um arquivo específico seja o primeiro a sair? para que --occurrenceapareça imediatamente no primeiro arquivo? Eu acho que é sobre nomes de arquivos, então algo chamado aaaaa.jpg sairia primeiro, por exemplo?
Jeff

1
@ Jeff: Na verdade não. Isso apenas impede que você tarcontinue pesquisando no tarball por versões mais recentes de um arquivo encontrado. Em vez disso, ele retorna, como diz a página do manual the Nth occurrence,. Se você especificar um arquivo para extrair na linha de comando e disser --occurrenceque o tar será encerrado assim que o encontrar e, portanto, efetivamente parará no "primeiro arquivo".
precisa saber é

1

Infelizmente, o formato do arquivo tar não contém um índice centralizado - portanto, o arquivo deve ser lido sequencialmente para localizar um arquivo específico. Ele foi originalmente projetado para backups em fita ( "tar" vem de t macaco ar cebolinha), que não teria apoiado uma tal operação, em qualquer caso.

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


1

Ao lidar com um grande uso de tarball:

--fast-readextrair apenas a primeira entrada do arquivo que corresponde ao operando do nome do arquivo, path/to/fileneste caso - que é sempre único no tarball de qualquer maneira

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

o acima irá procurar até encontrar uma correspondência e sair


1
Eu queria entender por que isso ainda é zero. man tar(GNU tar 1.29) nem sequer imprime esta opção. No entanto, o Ubuntu parece tê-lo ativado por padrão . Lendo rapidamente, não sei ao certo o que --fast-readé diferente --occurrence. Mas então --occurrencenem está na página do Ubuntu, mas está man tar. São --fast-reade --occurrencea mesma coisa possivelmente?
Jeff Jeff

Nenhuma dessas opções é especificada pelo padrão e, como sempre com opções fora do padrão, deve-se tomar cuidado para garantir que o utilitário em seu sistema as suporte. A opção --occurrences é suportada pelo GNU tar. A opção --fast-read é suportada por versões recentes do tar do FreeBSD, empacotadas como bsdtar pelo Ubuntu. Veja aqui para mais.
phogg
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.