Existe-t-il un MD5 (ou similaire) dans un dossier? Comment vérifier si deux dossiers sont égaux?

10

Je voudrais trouver un md5sum(ou un calcul similaire) d'un dossier sans le compresser dans une archive.

Par exemple, si dans le dossier que MyFoldernous avons les fichiers 1.txt, 2.txtet 3.txt, contenant:


1.txt

Le texte en 1.txt

2.txt

Le texte en 2.txt

3.txt

Le texte en 3.txt


Comment puis-je calculer la md5sumtotalité de cet ensemble MyFolder? Y a-t-il un moyen? Je veux l'utiliser pour vérifier si deux dossiers ont le même contenu.

Cela peut être utilisé pour vérifier si deux CD ou dossiers sont égaux. J'aimerais un moyen simple de le faire.

GarouDan
la source

Réponses:

15

L' outil md5deep a été développé précisément dans ce but. De nombreuses distributions Linux le proposent sous forme de package.

David Schwartz
la source
1
THX! Cela a bien fonctionné pour moi. Pour les autres utilisateurs ayant le même problème à aimer ça: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory Thx beaucoup.
GarouDan
@GarouDan. La commande que vous avez affichée suivra des liens symboliques. Vous pouvez utiliser l' -ooption pour gérer les types de fichiers.
Peter.O
Oh thx ... je ne sais pas ... vraiment utile. Je m'en souviendrai!
GarouDan
4

Si vous ne voulez pas l'archiver, vous pourriez peut-être faire quelque chose comme ça

diff <(find folder1) <(find folder2)

Vous devrez peut-être adapter les findcommandes pour être plus précis.

MODIFIER Vous pouvez ajouter -execà votre appel de recherche pour comparer le contenu des fichiers. Quelque chose de similaire à ceci:

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

N'oubliez pas que vous voudrez peut-être adapter cela.

rahmu
la source
C'est un point intéressant. Cela répertorie tous les fichiers de chaque dossier ... mais si j'ai une très grande quantité d'archives ... comment vérifier qu'il y a les mêmes fichiers (avec les données - peut-être en utilisant un outil md5sum) dans chaque dossier?
GarouDan
1
Faites ensuite un diff de la sortie MD5SUM de chaque fichier. Vous avez juste besoin d'enchaîner les commandes find, md5sum et diff différemment.
sybreon
Réfléchissez aussi à vos idées, cya ... Je vais essayer des choses intéressantes avec celles-ci trouver comand après ... merci.
GarouDan
3

Une façon de tester pourrait être de générer une somme md5 basée sur la concaténation de tous les fichiers du dossier et de ses sous-dossiers. Gardez à l'esprit que cela nécessite également que les fichiers aient les mêmes noms (car ils doivent être dans le même ordre de tri). Le code suivant devrait fonctionner:

#!/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 ; }

Si vous vous souciez vraiment des noms de fichiers, etc., vous pouvez utiliser une boucle pour comparer ce qui se trouve dans ${_files_in_old_dir}et ${_files_in_new_dir}. Cela devrait fonctionner dans la plupart des cas (il vérifie au moins le nombre de fichiers dans le répertoire et ses sous-répertoires).

Chris Down
la source
Ceci est un joli script ... thx @Chris. Mais il a un problème ... en utilisant cat , les sous-dossiers plantent avec des erreurs ... Avez-vous une idée pour le résoudre? Merci beaucoup.
GarouDan
Ça fonctionne bien pour moi. Assurez-vous que votre coque prend en charge globstar. Quelle est l'erreur?
Chris Down
1
Cela "fonctionne" (+1) ... mais globstar dans bash 4 suit les liens symboliques des répertoires , mais ce n'est un problème que si l'un des répertoires contient un lien symbolique.
Peter.O
@fered Bon appel, j'ai ajouté dans un test.
Chris Down
0

J'ai remarqué que le message d'origine est assez ancien, cependant, je pense que ces informations peuvent toujours être utiles à ceux qui recherchent une solution pour vérifier que les fichiers sont copiés correctement. Rsync pourrait être la meilleure méthode pour copier les données et les réponses données dans ce fil sont bonnes, cependant pour ceux qui ne sont pas expérimentés avec Linux, j'essaierai de donner une explication plus détaillée.

Scénario: vous venez de copier des données d'un disque à un autre, avec de nombreux sous-répertoires et fichiers. Vous souhaitez vérifier que toutes les données sont copiées correctement.

Vérifiez d'abord que md5deep est installé en exécutant la commande md5deep -v.

Si vous obtenez un message disant quelque chose comme «commande introuvable», installez md5deep par apt-get install md5deep.

Il est supposé que vous ne souhaitez traiter que des fichiers standard. Si vous souhaitez traiter d'autres types de fichiers, reportez-vous à l'indicateur -o dans le manuel md5deep. ( man md5deep)

Maintenant, vous êtes prêt à partir, et nous supposons que vous avez copié des fichiers de /mnt/orginalà /mnt/backup, remplacez-les par tous les répertoires que vous utilisez.

Modifiez d'abord le répertoire source, il s'agit de la source d'origine des fichiers que vous avez copiés ou sauvegardés:

cd /mnt/orginal

Faites ensuite une somme de contrôle de chaque fichier:

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

Cette commande a expliqué:

-r active le mode récursif

-e affiche un indicateur de progression

-l active les chemins d'accès relatifs aux fichiers.

-o f ne fonctionne que sur les fichiers normaux (pas les périphériques bloqués, les canaux nommés, etc.)

. indique à md5deep de démarrer dans le répertoire courant.

>> /tmp/checksums.md5indique à md5deep de rediriger toutes les sorties vers /tmp/checksums.md5.

Remarque: si vous souhaitez remplacer le contenu des versions précédentes de /tmp/checksums.md5, utilisez >et non>>

Notez que cette commande peut prendre un certain temps, selon la vitesse io et la taille des données. Vous pouvez expérimenter avec nice et / ou ionice pour augmenter les performances de md5deep, mais cela sort du cadre de cette réponse.

Une fois la création des sommes de contrôle terminée, vous disposez désormais d'un fichier contenant des entrées similaires à:

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

La première colonne est la somme de contrôle md5 et la deuxième colonne est le chemin d'accès relatif au fichier auquel appartient la somme de contrôle.

Si vous souhaitez voir combien de fichiers existent dans le fichier de somme de contrôle, exécutez la commande:

wc /tmp/checksums.md5 -l

Maintenant, vous voulez vérifier que les données copiées sont correctes:

cd /mnt/backup

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

La seule différence par rapport à la création des sommes de contrôle est -X qui affiche le hachage actuel d'un fichier si l'entrée dans le fichier checksums.md5 ne correspond pas . Ainsi, à la fin du test, s'il /tmp/compare.resultest vide, vous pouvez être sûr que tous les fichiers sont copiés correctement car les sommes de contrôle correspondent.

Notez que seuls les fichiers répertoriés dans le /tmp/checksums.md5fichier seront vérifiés pour une somme de contrôle correcte, s'il y a des fichiers supplémentaires dans le /mnt/backuprépertoire, md5deep ne vous en informera pas.

Remarques:

  • Vous n'avez pas nécessairement à utiliser la redirection pour stocker les fichiers de sortie. Reportez-vous au manuel md5deep pour plus d'informations.

  • Vous devrez peut-être exécuter les commandes md5deep en tant que root, selon les autorisations des fichiers que vous gérez.

NordicViking
la source
0

Si vous souhaitez vérifier récursivement les différences entre deux répertoires /path1et /path2 sans utiliser md5deep:

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

Explication:

  • est entré path1pour rendre toutes les lignes imprimées par findêtre relatif à path1( cd /path1)
  • liste tous les fichiers récursivement dans le chemin actuel ( && find . -type f)
  • utiliser chaque sortie de ligne par findcomme entrée pour md5( | xargs md5)

La sortie ressemblera à ceci s'il y a des différences:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
david_p
la source