A maneira ideal de combinar rapidamente os arquivos tar.gz

1

Estou procurando uma maneira de combinar vários arquivos tar.gz rapidamente.

O caso de uso é um cliente que clica em um botão de download e passa a ter um arquivo tar.gz entregue a eles. Há uma opção de configuração para adicionar informações adicionais ao download de saída na GUI de nosso aplicativo. Se esta opção for selecionada, será necessário combinar arquivos tar.gz adicionais para o download de saída.

Estou trabalhando com muitos dados aqui. Os arquivos tar.gz adicionais estão acima de GB quando descompactados. Além disso, o arquivo padrão tar.gz que é sempre entregue pode ter mais de 10 GB quando descompactado e pode conter mais de 100 arquivos nele. Devido aos grandes tamanhos dos dados com os quais estou trabalhando, eles são armazenados em um formato compactado ( tar.gz ) no disco.

Estou procurando implementar esse mecanismo no script Bash ou no Java .

    
por Andrew 08.09.2016 / 22:57

1 resposta

2

TLDR : normalmente você pode apenas concatená-los

O formato de arquivo usd por gzip é projetado de forma que a concatenação de dois ou mais arquivos compactados e a descompactação do resultado forneçam os mesmos dados que concatenam as versões descompactadas; Vejo link
link

Paralelamente, o formato tar foi originalmente projetado para que você possa adicionar entradas ao final de um arquivo. Isso foi efetivamente requerido porque o '(t) ape (ar) chive' foi projetado para usar fita magnética para backup e intercâmbio, e os drives de fita magnética dos anos 1950-1980 (aproximadamente) não podiam 'reescrever' com segurança (atualização) os dados existentes só adicionam ao final. (Essas unidades poderiam separar arquivos lógicos em uma fita usando uma 'marca de fita' mas sistemas Unix não suportavam metadados aka rótulos em magtape e gerenciar grandes números de arquivos de fita pela posição numérica física era apenas uma PITA , então a abordagem tar de adicionar a um arquivo existente era muito preferida.

Nos últimos anos, isso se tornou muito menos comum, e o GNU tar agora não suporta por padrão; você tem que especificar -i (ou formulário longo --ignore-zeros ) e então funciona bem:

$ printf 'ONEONEONE%90d\n' {0..99999} >file1
$ printf 'TWOTWOTWO%90d\n' {0..199999} >file2
$ ll
total 29300
-rw-r--r--. 1 dthomps users 10000000 Sep  9 02:14 file1
-rw-r--r--. 1 dthomps users 20000000 Sep  9 02:15 file2
$ tar -czf tar1.tgz file1
$ tar -czf tar2.tgz file2
    # or tar -cf - file1 |gzip >tar1.tgz and similarly for 2, see below
$ cat tar2.tgz tar1.tgz >combined.tgz
$ tar -tvzif combined.tgz
-rw-r--r-- dthomps/users 20000000 2016-09-09 02:15 file2
-rw-r--r-- dthomps/users 10000000 2016-09-09 02:14 file1
  # or gunzip <combined.tgz |tar -tvif - see below
$

Os tars antigos podem suportar arquivos de concatenação por padrão (sem -i ); se eu tiver tempo para ativar alguns dos meus antigos sistemas de teste, mais tarde eu atualizarei. No entanto, eles geralmente não suportam compactação -z integrada como gtar, então você precisa usar as formas tar cf - | gzip > e gunzip < | tar -xf - .

Se você usar caminhos relativos para arquivos no archive, como é comum e preferido hoje, quando você extrair do resultado concatenado todas as entradas (ou todas as selecionadas) forem extraídas em relação ao mesmo novo diretório, você cria cada arquivo 'piece' com caminhos relativos que trabalham juntos conforme desejado. Se você quiser que o arquivo de uma peça anexada substitua um na parte principal, use o mesmo caminho / nome relativo; Se você quiser criar arquivos distintos, use caminhos / nomes relativos distintos.

    
por 09.09.2016 / 08:43