Essa pergunta é bem antiga, mas eu gostaria que tivesse sido mais fácil encontrar as informações a seguir mais cedo. Então, se alguém mais se deparar com isso, aproveite:
O que Jeff descreve acima é um bug conhecido no gnu tar (reportado em agosto de 2008). Apenas o primeiro arquivo (aquele após a opção -f
) obtém seu marcador EOF removido. Se você tentar concatenar mais de dois arquivos, o (s) último (s) arquivo (s) será (ão) ocultado (s) por trás dos marcadores de fim de arquivo.
It is a bug in tar. It concatenates entire archives, including
trailing zero blocks, so by default reading the resulting archive stops
after the first concatenation.
Source: https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (and following messages)
Considerando a idade do bug, eu me pergunto se ele será consertado. Eu duvido que haja uma massa crítica afetada.
A melhor maneira de contornar este bug pode ser usar a opção -i
, pelo menos para arquivos .tar no seu sistema de arquivos.
Como Jeff aponta, tar --concatenate
pode levar muito tempo para alcançar o EOF antes de concatenar o próximo arquivo. Então, se você estiver preso a um arquivo "quebrado" que precisa da opção tar -i
para descompactar, sugiro o seguinte:
Em vez de usar
%código%
provavelmente será melhor executar tar --concatenate -f archive1.tar archive2.tar archive3.tar
ou redirecionar para cat archive2.tar archive3.tar >> archive1.tar
se você pretende gravar em um dispositivo de fita.
Note também que isso pode levar a um comportamento inesperado se as fitas não forem zeradas antes de escrever novos dados nelas. Por essa razão, a abordagem que vou tomar na minha aplicação é o tars aninhado, como sugerido nos comentários abaixo da pergunta.
A sugestão acima é baseada no seguinte exemplo de referência muito pequeno:
time tar --concatenate -vf buffer.100025.tar buffer.100026.tar
real 65m33.524s
user 0m7.324s
sys 2m50.399s
time cat buffer.100027.tar >> buffer.100028.tar
real 46m34.101s
user 0m0.853s
sys 1m46.133s
Os arquivos buffer. *. tar são todos de tamanho de 100 GB, o sistema estava praticamente inativo, exceto para cada uma das chamadas. A diferença de tempo é significativa o suficiente para que eu pessoalmente considere este benchmark válido apesar do pequeno tamanho da amostra, mas você está livre para seu próprio julgamento sobre isso e provavelmente melhor para executar um benchmark como este em seu próprio hardware.