Adicionando o arquivo aos arquivos tbz

8

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

A minha pergunta é, existe uma maneira mais rápida de fazer isso sem extrair o conteúdo de cada tbz, em seguida, comprimir novamente com o novo arquivo incluído no tar contido? Como seriam os comandos?

Obrigado

    
por Bott0610 15.02.2018 / 17:13

2 respostas

12

Embora tar possa adicionar arquivos a um arquivo já existente, ele não pode ser compactado. Você terá que bunzip2 do arquivo compactado, deixando um tarball padrão. Em seguida, você pode usar a capacidade de tar de adicionar arquivos a um arquivo existente e, em seguida, recompactar 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.
    
por 15.02.2018 / 17:19
10

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.

    
por 15.02.2018 / 18:07