Calcular a soma de verificação MD5 de um diretório

29

Estou procurando uma maneira rápida de comparar o conteúdo do diretório. É possível fazer um md5sum (ou soma de verificação equivalente) de um diretório inteiro?

Usando o Ubuntu Linux

baiacu
fonte
Você também pode querer usar o diff para comparar diretórios, que realmente mostrarão onde os diretórios diferem. unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee
@Kibbee Para evitar isso, é necessário levar em consideração algo diferente do conteúdo dos dados de cada arquivo e exatamente como você faz a soma de verificação dos arquivos. Dado: [somas de verificação] 1. A (Diretório) - Arquivo1 [ABC] - Arquivo2 [CBA] 2. B (Diretório) - Arquivo1 [ABC] - B1 (Diretório) - Arquivo2 [CBA] 3. C (Diretório) - Arquivo4 [ABC] - Arquivo5 [CBA] 4. D (Diretório) - Cópia do arquivo1 [ABC] - Cópia do arquivo2 [CBA] Os diretórios A e B não são idênticos, embora contenham os mesmos arquivos (embora em B1 , o Arquivo2 esteja em um subdiretório) . No seu exemplo, A e C seriam considerados idênticos porque
Jacob Lyles

Respostas:

36

Certo - md5sum directory/*

Se você precisar de algo um pouco mais flexível (por exemplo, para recursão de diretório ou comparação de hash), tente md5deep.

apt-get install md5deep
md5deep -r directory

Para comparar uma estrutura de diretórios, você pode fornecer uma lista de hashes para comparar:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

Isso produzirá todos os arquivos no diretório2 que não correspondem ao diretório1.

Isso não mostra os arquivos que foram removidos do diretório1 ou os arquivos que foram adicionados ao diretório2.

Shane Madden
fonte
Não é o que eu quis dizer, mas o que eu queria :) Eu quis dizer recursivamente e obtendo UM hash no final, mas acho que isso pode ser feito com md5deep -l e com hash na saída.
baiacu
1
A ordem do hashing não é consistente, então teria que ordenar a saída antes de hashing
baiacu
1
Para obter uma ordem determinística, use o -j0que desativa o multithreading (consulte a página de manual).
Johann
1
@ ShaneMadden ♦ Eu instalei md5deepcom sudo apt-get install md5deepon Ubuntu 16.04mas quando tentei ler a página de homem ele me diz que> nenhuma entrada manual para md5deep
Kasun Siyambalapitiya
27

Se você gostaria de ver o que há de diferente (se houver) entre dois diretórios, o rsync seria uma boa opção.

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

Isso listará todos os arquivos diferentes.

JakePaulus
fonte
2
diff -qr /source/directory/ /destination/directory/também mostraria arquivos que diferem.
Konerak
Existe uma maneira de realizar uma comparação bit a bit em vez de somas de verificação? Pode ser mais rápido em unidades locais.
Ali
Muito agradável. Funciona se origem ou destino também são remoto pasta por exemplousername@hostname:/destination/directory
Thalis K.
11

Eu acho que respondi a este antes com esta resposta:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

dá: b1a5b654afee985d5daccd42d41e19b2877d66b1

a idéia é que você hash todos os arquivos cortem os hashes um por linha, classifique-os e o hash produzindo um único hash. isso não depende dos nomes dos arquivos.

Dan D.
fonte
5

O aplicativo cfv é bastante útil, não apenas pode verificar e criar somas de verificação MD5, mas também pode fazer CRC32, sha1, torrent, par, par2.

para criar um arquivo de soma de verificação CRC32 para todos os arquivos no diretório atual:

cfv -C

para criar um arquivo de soma de verificação MD5 para todos os arquivos no diretório atual:

cfv -C -t md5 -f "diretório atual.md5sums"

Para criar um arquivo de soma de verificação separado para cada subdiretório:

cfv -C -r

Para criar um arquivo "super" de soma de verificação contendo arquivos em todos os subdiretórios:

cfv -C -rr
Hubert Kario
fonte
4

Eu usei o hashdeep, conforme explicado nesta resposta do askubuntu: Verifique a correção dos arquivos copiados :

Para calcular as somas de verificação:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

Para verificar e listar as diferenças:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

Isso tem uma vantagem sobre o md5deep, pois ele mostra arquivos renomeados (movidos), adicionados e removidos, além de evitar o problema com arquivos de tamanho 0, apontados na parte inferior de http://www.meridiandiscovery.com/how- para / validating-copy-results-using-md5deep .

Argyle
fonte
3

Isso funcionou para mim: (execute-o no diretório em que você está interessado)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum
calças de gato
fonte
1

Você pode criar somas MD5 de todos os arquivos, ordenar essas somas de verificação em ordem alfabética e tê-las (com ou sem novas linhas). Como o MD5 é criptográfico, deve funcionar bem com hashes de hashes.

Deve haver uma certa ordem para as coisas, caso contrário, você obterá resultados diferentes para dirs iguais.

E você deve considerar que a adição de algum arquivo para um dir vai mudar completamente o resultado, mesmo que fosse apenas um .directoryde .DS_Storearquivo.

Martin Ueding
fonte
Tecnicamente, pode-se obter o mesmo hash para diretórios diferentes. Se o diretório A tiver 2 arquivos com o conteúdo 'ab' e 'c' e o diretório B tiver 2 arquivos com o conteúdo 'a' e 'bc', o hash somente dos dados nos arquivos produzirá os mesmos resultados, mesmo que eles tenham arquivos com conteúdos diferentes. Eu nem tenho certeza de como alguém definiria o MD5Sum de um diretório.
Kibbee
1

Como um caso específico, digamos que você deseja copiar alguns arquivos do diretório1 para o diretório2 e, em seguida, verifique uma cópia bem-sucedida usando uma comparação md5.

Primeiro. cd para directory1 e digite:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

que criará um arquivo de referência contendo uma soma md5 para cada arquivo no diretório1. Feito isso, tudo o que você precisa fazer é cd para directory2 e digite:

md5sum -c ~/Desktop/md5sum.txt

O programa md5sum busca cada caminho do arquivo md5sum.txt, calcula o md5sum desse arquivo na pasta de destino e o compara com a soma armazenada no arquivo.

Após a conclusão do processo, você obterá um resumo como 'Então, e tantos arquivos não corresponderam' ou algo parecido.

Joel
fonte
1

Eu precisava verificar a integridade dos backups / espelhos que contêm um grande número de arquivos e acabei escrevendo um programa de linha de comando chamado MassHash. Está escrito em Python. Um lançador GTK + também está disponível. Você pode conferir ...

http://code.google.com/p/masshash/

Jonathan
fonte