A outra resposta está correta: você não pode atualizar corretamente um arquivo tar compactado sem descompactá-lo. A documentação tar do GNU 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 trabalhos sujos que não exija descompressão, eu posso fornecer uma, com base nas seguintes observações:
- A adição de fluxos bzip2 usando
cat
é suportada e produz um fluxo bzip2 válido (o mesmo ocorre com o gzip);
- anexar alcatrões usando
cat
não produz um arquivo tar válido, razão pela qual a --concatenate
opção existe, mas podemos pedir ao tar para fingir que é válido:
Pode parecer mais intuitivo para você querer ou tentar usar o gato para concatenar dois arquivos em vez de usar a --concatenate
operação; afinal, cat é o utilitário para combinar arquivos.
No entanto, os arquivos tar incorporam um marcador de fim de arquivo que deve ser removido para que os arquivos concatenados sejam lidos corretamente como um único arquivo. --concatenate
remove o marcador de fim de arquivo morto do arquivo de destino antes que cada novo arquivo morto seja anexado. Se você usar cat para combinar os arquivos, o resultado não será um arquivo no formato tar válido. Se você precisar recuperar arquivos de um archive adicionado ao uso do utilitário cat, use a opção --ignore-zeros
( -i
).
Com base nesse conhecimento, podemos fazer, por exemplo:
cat {one,two}.tar.bz2 >combined.tar.bz2
Isso resulta, como o snippet de documentação acima explica, 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 acima lista todos os três arquivos dos dois arquivos originais, enquanto a omissão -i
(corretamente) lista apenas os arquivos do primeiro arquivo original:
$ tar tf combined.tar.bz2
a
b
Mais uma vez, isso não passa de um truque sujo, mas pode ser útil se você controlar os lados de escrita e leitura e garantir que -i
será usado ao tentar ler os arquivos criados dessa maneira.