md5sum em arquivos grandes

md5sum em arquivos grandes

Contexto:

Eu tenho uma unidade grande de terabytes com vários tipos de arquivos de mídia grandes, arquivos de imagem ISO, etc. Gostaria de verificar seu conteúdo usando md5sumo primeiro megabyte devido à velocidade/desempenho.

Você pode criar uma soma como esta:

FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5

Como você verificaria isso, já que a assinatura do primeiro megabyte é diferente da assinatura do arquivo inteiro?

Já vi isso ser feito em outros idiomas, mas estou me perguntando como fazer isso emBash. Eu experimentei várias md5sum -cpermutações envolvendo tubos e outros enfeites.


Em vez de usar md5sum -c, você teria que recalcular os hashes em um novo arquivo e depois 'diferenciá-los'?

Você pode usar um

find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah

para trabalhar em um grande número de arquivos.

PS:Rsync não é uma opção

ATUALIZAÇÃO 2: Assim como está -

Usando head, find e md5sum; seria possível criar um arquivo do diretório de origem rapidamente e verificá-lo com o diff do outro lado após calcular o destino. Existem frases ou scripts inteligentes para isso?

Responder1

Verificar o conteúdo amostrando apenas o primeiro megabyte de um arquivo provavelmente não detectará se alguns dos arquivos maiores foram corrompidos, danificados ou alterados de uma forma ou de outra. A razão para isso é que você está fornecendo ao algoritmo de hash apenas um megabyte de dados, quando pode haver centenas de outros megabytes que podem estar errados. Mesmo um bit na posição errada daria uma assinatura diferente.

Se a integridade dos dados é o que você deseja verificar, é melhor usar o algoritmo CRC32. É mais rápido que MD5. Embora seja possível falsificar/modificar um arquivo para parecer ter a assinatura CRC32 correta, não é provável que pedaços aleatórios de corrupção façam isso.

Atualizar:

Aqui está uma boa linha para fazer a soma de verificação md5 baseada em 1 megabyte em cada arquivo:

find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"

Substitua md5sum por cksum se desejar. Observe que optei por incluir o nome do arquivo na saída. Isso ocorre porque a string do nome do arquivo não é transmitida quando você não fornece o arquivo inteiro ao md5sum.

Responder2

Uma solução/exemplo um pouco modificado, usando o argumento find -size para limitar apenas arquivos maiores que 10M e computando md5sum do primeiro 1M e do último 1M do arquivo.

find . -type f -a -size +10M -print0 | xargs -0 -n1 -I{} sh -c 'echo "$( (head -c 1M '{}'; tail -c 1M '{}' ) | md5sum) {} "'

informação relacionada