A ferramenta md5deep foi desenvolvida exatamente para esse propósito. Muitas distribuições Linux oferecem em forma de pacote.
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:
O texto em 1.txt
O texto em 2.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.
A ferramenta md5deep foi desenvolvida exatamente para esse propósito. Muitas distribuições Linux oferecem em forma de pacote.
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.
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).
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.
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:
path1
para tornar todas as linhas impressas por find
relativas a path1
( cd /path1
) && find . -type f
) 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
Tags files checksum verification