Extraia o tarball informado e repita-o exatamente

6

Meu projeto versionado usa o conteúdo de um tarball de envio. Eu gostaria de extrair o conteúdo de forma a poder recriar exatamente o tarball original. O motivo é que não quero incluir grandes blobs binários em meu projeto com versão. O retraring não é confiável, muitas vezes produzindo tarballs ligeiramente diferentes. Eu suspeito que a heurística do algoritmo de compressão produz resultados diferentes sob condições diferentes.

EDIT: Um outro problema que dificulta a solução é que alguns sistemas de versionamento (git) não rastreiam diretórios vazios, excluindo soluções do que não envolvem a criação de um arquivo de metadados auxiliares. Veja meu comentário para Hauke. (Obrigado Hauke por esta edição).

    
por Mayavimmer 18.02.2014 / 21:27

2 respostas

4

Repetir os arquivos pode resultar em arquivos diferentes porque a ordem em que tar anexa os arquivos ao arquivo não é necessariamente estável. Para garantir que os arquivos sejam recalculados na mesma ordem em que estavam originalmente, liste os arquivos no archive e salve-os em um arquivo:

tar -tf your-archive.tar > file-list.txt

Em seguida, re-tar-los na mesma ordem exata, lendo os arquivos a serem adicionados a partir da lista que você criou anteriormente (uma vez que essa lista também pode conter diretórios e não queremos descer para eles nesse ponto, precisamos --no-recursion ):

tar -cf your-new-archive.tar --no-recursion -T file-list.txt

Supondo que nenhum dos arquivos (ou seus atributos) foram alterados, your-new-archive.tar será exatamente idêntico a your-archive.tar .

No entanto, você terá um problema ao criar arquivos compactados: por padrão, gzip adiciona um registro de data e hora a cada arquivo compactado que cria. Para evitar isso, você precisará canalizar a saída de tar para gzip (em vez de usar a opção tar -z) e desabilite os timestamps com -n :

tar -c --no-recursion -T file-list.txt | gzip -n > your-new-archive.tar.gz
    
por 18.02.2014 / 21:43
3

O que você quer provavelmente não é possível, veja esta pergunta:

UNIX ctime: como manter isso informações preciosas em backups (tar)?

Assim, se o arquivo tar original contiver ctime, você terá problemas sérios que não podem ser resolvidos com um esforço razoável.

Outro problema é uma string de cabeçalho no formato Gnu tar que, por padrão, contém o PID do processo que cria o archive. Você pode desativar isso, mas isso não seria suficiente, já que você deve copiá-lo do original.

Suas chances são melhores se o original estiver no formato ustar (você cria isso com --format=ustar ).

E para manter a ordem dos arquivos no arquivo, você deve extrair para um diretório vazio (ou use a abordagem -T da resposta de n.st ).

    
por 18.02.2014 / 21:56

Tags