A compactação de duas pastas idênticas fornece um resultado diferente

5

Eu tenho duas pastas idênticas, com a mesma estrutura e conteúdo como este:

folder_1
  hello.txt
  subfolder
    byebye.txt

folder_2
  hello.txt
  subfolder
    byebye.txt

se eu os compactar como formato tar.xz, recebo dois arquivos diferentes com dois tamanhos de arquivo diferentes (apenas alguns bytes, mas eles não são idênticos).

$ cd folder_1 && tar -Jcf archive.tar.xz *
$ cd folder_2 && tar -Jcf archive.tar.xz *

Eu recebo:

folder_1/archive.tar.xz != folder_2/archive.tar.xz

e, claro, se eu md5sum ou sha1sum eu tiver dois hashes diferentes

E esse é o meu problema ... Preciso verificar se um arquivo fornecido é idêntico ao que tenho em meu armazenamento. Eu não posso usar hashing nem apenas verificar tamanhos de arquivo.

Usar zip em vez de tar.xz funciona como zip sempre produz resultados idênticos de arquivos idênticos. Por que isso está acontecendo? Existe uma maneira de evitar isso?

    
por lviggiani 22.02.2017 / 11:54

3 respostas

5

Ok, a explicação dada pelo ddnomad está correta. É sobre o timestamp.

Aqui está a solução:

adicione --mtime='1970-01-01' ao comando tar:

tar --mtime='1970-01-01' -Jcf archive.tar.xz *

Isso forçará o timestamp do conteúdo para um valor fixo, resultando em arquivos idênticos.

    
por 22.02.2017 / 13:24
3

Cada arquivo (a pasta é um arquivo também) possui um registro de data e hora incorporado.

Eu presumo que você não possa criá-los para as estruturas de pastas ao mesmo tempo, para que os carimbos de hora desses arquivos sejam diferentes.

Como resultado, o arquivamento ou o hashing proporcionam resultados diferentes, pois o registro de data e hora é uma parte do arquivo usado em ambas as operações.

Então essa é a diferença entre estruturas de arquivos aparentemente idênticas.

UPDATE: a partir da verificação de que eles têm conteúdos semelhantes, acho que você realmente precisa verificar o conteúdo desses arquivos e compará-los.

    
por 22.02.2017 / 12:01
0

Existem vários motivos pelos quais dois tarballs da mesma árvore de diretórios podem ser diferentes. Os principais são:

  • Metadados como propriedade, carimbos de data e hora, etc. podem ser diferentes. Para obter um arquivo tar reproduzível, você precisa ter a mesma propriedade, permissões e carimbos de data e hora. Certifique-se de ter copiado todos os metadados (se você tiver conteúdo de arquivo idêntico com metadados diferentes, cp -a --attributes-only pode ajudar). Com o GNU tar, existem algumas opções que você pode usar para ignorar certos atributos:

    • --numeric-owner armazena apenas IDs de usuários e grupos numéricos, não nomes.
    • --owner e --group forçam os arquivos a serem registrados sob um determinado usuário e grupo, respectivamente (por exemplo, --owner=0 --group=0 para registrar todos os arquivos como pertencentes ao root).
    • --set-mtime permite que você armazene todos os arquivos com um timestamp em vez do real.
  • A ordem em que os arquivos são armazenados pode ser diferente. A maioria dos sistemas de arquivos não oferece nenhuma garantia específica quanto à ordem em que os arquivos são listados em um diretório, e tar os lista como eles vêm. (Você pode ver o pedido com ls -U .) O GNU tar 1.28 tem uma nova opção --sort=name . Com versões mais antigas ou outras implementações, você pode obter uma ordem de arquivo reproduzível construindo uma lista classificada de nomes de arquivos e passando-os para o tar:

    find . -print0 | LC_ALL=C sort -z | tar --no-recursion -Jcf ../archive.tar.xz -T -
    

Você pode estar interessado na página wiki Debian em compilações reproduzíveis .

    
por 23.02.2017 / 01:09