Adicionando arquivo aos arquivos tbz

8

Estou procurando uma maneira de atualizar milhares de arquivos .tbz, por isso farei isso com um script de shell. Eu preciso adicionar um arquivo para cada um.

Minha pergunta é: existe uma maneira mais rápida de fazer isso sem extrair o conteúdo de cada tbz e depois comprimir novamente com o novo arquivo incluído no tar contido? Como seriam os comandos?

obrigado

BottleZero
fonte
Uma alternativa óbvia é colocar arquivos compactados em um tarball não compactado. Mas isso altera o formato dos dados para que não seja viável para você e pode ser ineficiente para grandes números de arquivos pequenos com redundância entre eles.
Restabeleça Monica

Respostas:

12

Embora tarpossa adicionar arquivos a um arquivo morto já existente, ele não pode ser compactado. Você terá que bunzip2arquivar compactado, deixando um tarball padrão. Você pode usar tara capacidade de adicionar arquivos a um arquivo existente e, em seguida, recomprimir com bzip2.

Do manual:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.
DopeGhoti
fonte
é verdade
Kiwy 15/02
Este é um método, mas não é o único método. É possível modificar um fluxo bzip2 sem descompactá-lo completamente. Não sei se é possível fazer isso de uma maneira que permita anexar corretamente a um arquivo tar, mas o dhag mostra um método parcial.
Gilles 'SO- stop be evil'
10

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 catnão produz um arquivo tar válido, razão pela qual a --concatenateopçã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 --concatenateoperaçã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. --concatenateremove 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 -iserá usado ao tentar ler os arquivos criados dessa maneira.

dhag
fonte
Muito obrigado pela resposta detalhada. Infelizmente, não estou no controle do processo que acabará por ler esses arquivos.
BottleZero
Isso pode ser usado para "ocultar" alguns arquivos em um arquivo, para que alguém que extraia casualmente obtenha apenas o conteúdo do tarball original, mas aqueles que sabem adicionar a ilinha de comando verão a coisa toda.
Monty mais duro