Arquivos hash no arquivo tar

Arquivos hash no arquivo tar

Eu tenho dois *.tararquivos com conteúdo semelhante. Quero verificar quais arquivos são iguais. Muitos arquivos são grandes, então comparar hashes exigiria a extração de cada arquivo de cada tar e o cálculo do hash. Existe uma maneira de fazer hash de arquivos em um tar sem precisar extraí-lo? Existe outra maneira de comparar arquivos entre dois *.tararquivos?

Responder1

Se for GNU tar, execute isto:

tar -xf file1.tar --to-command=file-stats-from-tar

onde file-stats-from-tar está em algum lugar $PATHe é:

#!/bin/bash

md5=`md5sum`;
md5=${md5%% *}

printf "%s\t%s\n" $md5 "$TAR_FILENAME"

Mude md5sumse precisar.

Isso faz tudo em uma única passagem.

Como funciona é que a --to-commandopção diz ao tar para enviarcadaarquivo separadamente para o comando que você especificar, com um monte de variáveis ​​de ambiente definidas (usamos apenas TAR_FILENAMEaqui).

Responder2

Pode haver maneiras mais eficientes, mas consegui descobrir isso em alguns momentos:

tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done

O primeiro tar tfapenas lista os arquivos no arquivo, que são então passados ​​para o while read xloop bash. Para cada nome de arquivo, ele encontra o hash usando. tar xfO test.tar ${x} | md5sumObviamente, você poderia substituir md5sum pela sua ferramenta de hash preferida. O uso estranho de echo $() ${x}é apenas manter a saída semelhante a uma saída hash normal com os valores à esquerda e os nomes dos arquivos à direita. Sem isso, ele apenas fornece os hashes de todos os arquivos, mas nenhum nome, para que você não saiba qual foi para qual. Mesmo assim, há uma coluna extra -na saída que normalmente não existe. Ele poderia ser facilmente removido com um colrmcomando no pipeline.

Isso pode não ser o mais eficiente, pois é necessário passar pelo arquivo tar n+1 vezes se houver n arquivos nele, mas esperamos que o conteúdo do tar seja armazenado em cache após a primeira leitura.

informação relacionada