107 votes

Générer la somme de contrôle md5 pour tous les fichiers d'un répertoire

Je voudrais créer une liste de sommes de contrôle md5 pour tous les fichiers d'un répertoire.

Je veux cat filename | md5sum > ouptput.txt . Je veux faire cela en une seule étape pour tous les fichiers de mon répertoire.

Toute aide serait la bienvenue.

153voto

Mufaka Points 54

Vous pouvez passer md5sum des noms de fichiers multiples ou des expansions bash :

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Si vous voulez être plus fantaisiste, vous pouvez utiliser des choses comme find pour explorer et filtrer les fichiers, ainsi que pour travailler de manière récursive :

find -type f -exec md5sum "{}" + > checklist.chk

18voto

lowrin Points 391

Un excellent programme de création/vérification de checksum est rhash .

  • Il peut créer des fichiers compatibles SFV, et les vérifier également.

  • Il prend en charge md4, md5, sha1, sha512, crc32 et bien d'autres encore.

  • Il peut faire de la création récursive ( -r ) comme md5deep o sha1deep .

  • Enfin, vous pouvez formater la sortie du fichier de somme de contrôle. Par exemple :

    rhash --md5 -p '%h,%p\n' -r /home/ > checklist.csv

    produit un fichier CSV comprenant le chemin d'accès complet des fichiers en commençant récursivement par l'élément /home répertoire.

Je trouve aussi que le -e option permettant de renommer les fichiers en insérant la somme crc32 dans le nom extrêmement utile.

Notez que vous pouvez également modifier md5sum con rhash en el Exemples de PhoenixNL72 .

7voto

PhoenixNL72 Points 81

Voici deux exemples plus complets :

  1. Créer un fichier md5 dans chaque répertoire qui n'en a pas déjà un, avec des chemins absolus :

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
  2. Créer un fichier md5 dans chaque dossier qui n'en a pas déjà un : pas de chemin, seulement des noms de fichiers :

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 

Ce qui diffère entre 1 et 2 est la façon dont les fichiers sont présentés dans le fichier md5 résultant.

Les commandes font ce qui suit :

  1. Construit une liste de noms de répertoires pour le dossier courant. (Arbre)
  2. Trier la liste des dossiers.
  3. Vérifier dans chaque répertoire si le fichier @md5sum.md5 existe. Sortie Sautée s'il existe, sortie Traitement s'il n'existe pas.
  4. Si le fichier @md5Sum.md5 n'existe pas, md5Sum en générera un avec les sommes de contrôle de tous les fichiers du dossier. 5) Configurez le fichier @md5Sum.md5 généré en lecture seule.

La sortie de ce script entier peut être redirigée vers un fichier (.....;done > test.log) ou être acheminée vers un autre programme (comme grep). La sortie vous indiquera seulement quels répertoires ont été sautés et lesquels ont été traités.

Après une exécution réussie, vous obtiendrez un fichier @md5Sum.md5 dans chaque sous-répertoire de votre répertoire courant.

J'ai nommé le fichier @md5Sum.md5 pour qu'il soit listé en haut du répertoire dans un partage samba.

La vérification de tous les fichiers @md5Sum.md5 peut être effectuée par les commandes suivantes :

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Ensuite, vous pouvez parcourir le checklog.txt en utilisant grep -v OK pour obtenir une liste de tous les fichiers qui diffèrent.

Pour régénérer un @md5Sum.md5 dans un répertoire spécifique, lorsque vous avez modifié ou ajouté des fichiers par exemple, supprimez le fichier @md5Sum.md5 ou renommez-le et exécutez à nouveau la commande generate.

3voto

Lizardx Points 346

J'ai rencontré ce problème, et bien que les solutions ci-dessus soient élégantes, je voulais un hack rapide et sale pour cette situation : 1 répertoire, avec des sous-répertoires d'un niveau de profondeur à l'intérieur.

Donc, entrez le répertoire dans un Shell et exécutez :

md5sum * */* 2>/dev/null > md5sum.md5

Cela récupère tous les fichiers dans le répertoire de premier niveau, supprime l'avertissement d'erreur concernant les sous-répertoires qui sont des répertoires, puis exécute md5sums sur le contenu des sous-répertoires. Avantage : facile à retenir, fait exactement ce qu'il est censé faire. Je m'embrouille toujours dans la syntaxe de find et je n'arrive jamais à m'en souvenir de tête, donc pas besoin de faire des boucles etc, de gérer les espaces dans les noms de répertoires, cette solution unique fonctionne bien. Ce n'est pas une solution puissante et robuste, pas bonne pour > 1 niveau de sous-répertoires, mais une solution rapide et facile pour le problème.

3voto

user1112863 Points 31

Voici le mien :

time find dirname/|xargs md5sum |tee dirname.md5

Il y a des erreurs lorsqu'il essaie de le calculer pour un répertoire, mais c'est suffisant pour moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X