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.txt
onde 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?
Respostas:
Infelizmente, para descompactar um único membro do
.tar.gz
arquivo, é 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 ozip
formato possui um diretório central de todos os arquivos contidos nele, com deslocamentos diretos apontando para o meio dozip
arquivo, 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.tar
arquivo compactado comgzip
compressor.gzip
é um compressor de streaming que só pode funcionar com um arquivo. Se você deseja obter qualquer parte dogzip
fluxo, você tem que descompactá-lo como um todo, e isso é o que realmente mata-lo para.tar.gz
(e para.tar.bz2
,.tar.xz
e outros formatos semelhantes com base em.tar
)..tar
formato é 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.tar
arquivo morto.Algumas pessoas pensam que mesmo os
.tar
membros do arquivo não podem ser acessados rapidamente, mas isso não é bem verdade. Se o.tar
archive 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.tar
arquivo contém muitos arquivos pequenos, isso significa que a recuperação rápida de membros se torna efetivamente impossível, mesmo para descompactados.tar
.fonte
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
não passará por todo o tarball depois de encontrar uma cópia de cada um
passwd
eshadow
, 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
tar
backups 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=NUMBER
para 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 aNUMBER
1.fonte
--occurrence
apareça imediatamente no primeiro arquivo? Eu acho que é sobre nomes de arquivos, então algo chamado aaaaa.jpg sairia primeiro, por exemplo?tar
continue pesquisando no tarball por versões mais recentes de um arquivo encontrado. Em vez disso, ele retorna, como diz a página do manualthe Nth occurrence
,. Se você especificar um arquivo para extrair na linha de comando e disser--occurrence
que o tar será encerrado assim que o encontrar e, portanto, efetivamente parará no "primeiro arquivo".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.
fonte
Ao lidar com um grande uso de tarball:
o acima irá procurar até encontrar uma correspondência e sair
fonte
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--occurrence
nem está na página do Ubuntu, mas estáman tar
. São--fast-read
e--occurrence
a mesma coisa possivelmente?