Eu tenho dois *.tar
arquivos 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 *.tar
arquivos?
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 $PATH
e é:
#!/bin/bash
md5=`md5sum`;
md5=${md5%% *}
printf "%s\t%s\n" $md5 "$TAR_FILENAME"
Mude md5sum
se precisar.
Isso faz tudo em uma única passagem.
Como funciona é que a --to-command
opçã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_FILENAME
aqui).
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 tf
apenas lista os arquivos no arquivo, que são então passados para o while read x
loop bash. Para cada nome de arquivo, ele encontra o hash usando. tar xfO test.tar ${x} | md5sum
Obviamente, 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 colrm
comando 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.