Existe MD5 (ou similar) em uma pasta? Como verificar se duas pastas são iguais?

10

Gostaria de encontrar um md5sum (ou cálculo semelhante) de uma pasta sem compactá-la em um arquivo.

Por exemplo, se na pasta MyFolder , tivermos os arquivos 1.txt , 2.txt e 3.txt , contendo:

1.txt

O texto em 1.txt

2.txt

O texto em 2.txt

3.txt

O texto em 3.txt

Como posso calcular o md5sum de todo este MyFolder ? Há algum caminho? Eu quero usar isso para verificar se duas pastas têm o mesmo conteúdo.

Isso pode ser útil para verificar se dois cds ou pastas são iguais. Eu gostaria de um jeito fácil de fazer isso.

    
por GarouDan 17.10.2011 / 00:51

5 respostas

15

A ferramenta md5deep foi desenvolvida exatamente para esse propósito. Muitas distribuições Linux oferecem em forma de pacote.

    
por 17.10.2011 / 02:18
4

Se você não quiser arquivá-lo, talvez possa fazer algo assim

diff <(find folder1) <(find folder2)

Você pode ter que adaptar os comandos find para ser mais preciso.

EDITAR Você pode adicionar -exec à sua chamada de localização para comparar o conteúdo dos arquivos. Algo semelhante a isto:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Lembre-se de que você pode querer adaptar isso.

    
por 17.10.2011 / 01:21
3

Uma maneira de testar pode ser gerar um md5sum com base na concatenação de todos os arquivos na pasta e em suas subpastas. Lembre-se de que isso também exige que os arquivos tenham os mesmos nomes (como devem estar na mesma ordem de classificação). O código a seguir deve funcionar:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Se você realmente se preocupa com os nomes dos arquivos, etc, pode usar um loop para comparar o que está em ${_files_in_old_dir} e ${_files_in_new_dir} . Isso deve funcionar para a maioria dos casos (pelo menos verifica o número de arquivos no diretório e em seus subdiretórios).

    
por 17.10.2011 / 02:45
0

Eu notei que a postagem original é bem antiga, mas acho que essa informação ainda pode ser valiosa para quem procura uma solução para verificar se os arquivos foram copiados corretamente. O rsync pode ser o melhor método para copiar dados e as respostas dadas neste tópico são boas, no entanto, para aqueles que não são experientes com o Linux, tentarei dar uma explicação mais detalhada.

Cenário: Você acabou de copiar dados de um disco para outro, com muitos subdiretórios e arquivos. Você quer verificar se todos os dados foram copiados corretamente.

Primeiro, verifique se o md5deep está instalado, emitindo o comando md5deep -v .

Se você receber uma mensagem dizendo algo como 'comando não encontrado', instale o md5deep por apt-get install md5deep .

Assume-se que você só quer lidar com arquivos regulares. Se você quiser lidar com outros tipos de arquivos, consulte o flag -o no manual do md5deep. ( man md5deep )

Agora você está pronto, e assumimos que você copiou arquivos de /mnt/orginal para /mnt/backup , substitua-os por qualquer diretório que você esteja usando.

Primeira alteração no diretório de origem, essa é a fonte original dos arquivos que você copiou ou fez o backup:

cd /mnt/orginal

Em seguida, faça uma soma de verificação de cada arquivo:

md5deep -rel -o f . >> /tmp/checksums.md5

Este comando explicou:

-r ativa o modo recursivo

-e exibe o indicador de progresso

-l ativa os caminhos de arquivos relativos.

-o f só funciona em arquivos regulares (não bloqueia dispositivos, pipes nomeados, etc.)

. diz ao md5deep para iniciar no diretório atual.

>> /tmp/checksums.md5 diz ao md5deep para redirecionar toda a saída para /tmp/checksums.md5 .

Se quiser substituir conteúdo nas versões anteriores de /tmp/checksums.md5 , use > e não >>

Observe que esse comando pode demorar um pouco, dependendo da velocidade do io e do tamanho dos dados. Você poderia experimentar com bom e / ou ionice para aumentar o desempenho do md5deep, mas isso está fora do escopo desta resposta.

Quando a criação das somas de verificação terminar, agora você tem um arquivo com entradas semelhantes a:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/event.d/anacron 50d89784c1e201f68ff978b95ff4bdfb ./oldconfig-11-09-2013/etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

A primeira coluna é a soma de verificação md5 e a segunda coluna é o caminho relativo para o arquivo ao qual a soma de verificação pertence.

Se você quiser ver quantos arquivos existem no arquivo de soma de verificação, emita o comando:

wc /tmp/checksums.md5 -l

Agora, você deseja verificar se os dados copiados estão corretos:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

A única diferença de quando criamos as somas de verificação é -X, que exibe o hash atual de um arquivo se a entrada no arquivo checksums.md5 não corresponder a não . Portanto, até o final do teste, se /tmp/compare.result estiver em branco, você pode confiar que todos os arquivos são copiados corretamente, pois as somas de verificação correspondem.

Observe que apenas os arquivos listados no arquivo /tmp/checksums.md5 serão verificados para uma soma de verificação correta; se houver arquivos adicionais no diretório /mnt/backup , o md5deep não notificará você sobre eles.

Notas:

  • Você não precisa necessariamente usar o redirecionamento para armazenar arquivos de saída. Consulte o manual do md5deep para mais informações.

  • Você pode ter que executar os comandos do md5deep como root, dependendo das permissões dos arquivos que está manipulando.

por 10.09.2014 / 12:04
0

Se você quiser verificar recursivamente as diferenças entre os dois diretórios /path1 e /path2 sem usando md5deep :

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Explicação:

  • entrou em path1 para tornar todas as linhas impressas por find relativas a path1 ( cd /path1 )
  • lista todos os arquivos recursivamente no caminho atual ( && find . -type f )
  • use cada saída de linha por find como entrada para md5 ( | xargs md5 )

A saída será semelhante a esta, se houver alguma diferença:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
    
por 26.01.2018 / 14:20