A outra resposta está correta: você não pode atualizar corretamente um arquivo tar compactado sem descompactá-lo. A documentação do GNU tar sugere, e a tentativa de atualização falha com uma mensagem de erro explícita :
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
No entanto, se você estiver interessado em uma solução de tipo de trabalho que não requer descompactação, eu posso fornecer uma, com base nas seguintes observações:
- Anexar streams bzip2 usando
cat
é suportado e produz um fluxo bzip2 válido (o mesmo vale para o gzip);
- acrescentar tars usando
cat
não produz um arquivo tar válido, e é por isso que existe a opção --concatenate
, mas podemos pedir ao tar para fingir que é válido:
It may seem more intuitive to you to want or try to use cat to concatenate two archives instead of using the --concatenate
operation; after all, cat is the utility for combining files.
However, tar archives incorporate an end-of-file marker which must be removed if the concatenated archives are to be read properly as one archive. --concatenate
removes the end-of-archive marker from the target archive before each new archive is appended. If you use cat to combine the archives, the result will not be a valid tar format archive. If you need to retrieve files from an archive that was added to using the cat utility, use the --ignore-zeros
(-i
) option.
Com base nesse conhecimento, podemos fazer, por exemplo:
cat {one,two}.tar.bz2 >combined.tar.bz2
Isso resulta, como explica o snippet de documentação acima, em um arquivo tar inválido, mas usando --ignore-zeros
, ele ainda pode ser lido completamente:
## Show contents of 'one.tar.bz2'
$ tar tf one.tar.bz2
a
b
## Show contents of 'two.tar.bz2'
$ tar tf two.tar.bz2
c
## Show contents of 'combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c
Observe como o arquivo acima lista todos os três arquivos dos dois arquivos originais, enquanto omitir -i
(corretamente) lista apenas os arquivos do primeiro arquivo original:
$ tar tf combined.tar.bz2
a
b
Mais uma vez, nada mais é do que um truque sujo, mas pode ser útil se você controlar os lados de escrita e leitura e se certificar de que -i
será usado ao tentar ler arquivos criados dessa maneira.