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

75

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

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

Toute aide serait formidable.

Walter Wayne Leutwyler
la source
Comment trouver la somme md5 (somme de contrôle) d'un fichier de sauvegarde spécifique? -Quelle doit être la ressemblance de mon script? -Quelle est sa commande?

Réponses:

110

Vous pouvez passer md5sumplusieurs noms de fichiers ou extensions 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 avoir du chic, vous pouvez utiliser des méthodes telles que l' findexploration et le filtrage des fichiers, ainsi que le travail récursif:

find -type f -exec md5sum "{}" + > checklist.chk
Oli
la source
1
♦ comment utiliser ce qui précède pour récupérer md5sumles fichiers dans les sous-répertoires, ceux-ci md5sum *émettant entrant au niveau des sous-répertoires en disant que ... est un répertoire
Kasun Siyambalapitiya
Désolé de demander en lançant find -type f -exec md5sum '{}' +et `find -type f -exec md5sum '{}'` j'ai pu l'obtenir. Merci :)
Kasun Siyambalapitiya
Je préfère le look de cette sortie plus:openssl md5 * > checklist.txt
ashley
1
Si vous utilisez un shell qui est heureux d'évaluer **récursivement (tel que zsh), c'est encore plus simple:md5sum **/* 2>/dev/null
Joost
12

Un bon programme de création / vérification de checksum est rhash. Il crée même des fichiers compatibles SFV et les vérifie aussi.

Il supporte md4, md5, sha1, sha512, crc32 et beaucoup d'autres.

De plus, il peut faire une création récursive (option -r) comme md5deep ou sha1deep.

Enfin et surtout, vous pouvez formater la sortie du fichier de somme de contrôle; par exemple:

rhash --md5 -p '%h,%p\n' -r /home/

génère un fichier CSV comprenant le chemin complet des fichiers de manière récursive en commençant par le /homerépertoire.

Je trouve extrêmement utile même l’option -e de renommer des fichiers en insérant crc32 sum dans name.

Vous pouvez changer "md5sum" avec "rhash" dans les exemples PhoenixNL72.

Marcolino
la source
1
Que fait exactement '/ home /' ici? Cet outil a l'air bien.
Andy Ibanez
Je pense que c'est une erreur, c'est certainement une erreur pour moi. Le -p est le format de la sortie. Je vais le corriger.
pbhj
7

Voici deux exemples plus complets:

  1. Créez un fichier md5 dans chaque répertoire qui n'en contient pas déjà, 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éez un fichier md5 dans chaque dossier qui n'en contient pas déjà: pas de chemins, uniquement 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 manière dont les fichiers sont présentés dans le fichier md5 résultant.

Les commandes font ce qui suit:

  1. Construire une liste de noms de répertoires pour le dossier actuel. (Arbre)
  2. Triez la liste des dossiers.
  3. Vérifiez dans chaque répertoire si le fichier @ md5sum.md5 existe. Sortie Ignorée si elle existe, sortie Traitement si elle 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) Définissez le fichier @ md5Sum.md5 généré en lecture seule.

La sortie de tout ce script peut être redirigée vers un fichier (.....; done> test.log) ou redirigée vers un autre programme (comme grep). La sortie vous indiquera uniquement quels répertoires ont été ignoré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 actuel.

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

La vérification de tous les fichiers @ md5Sum.md5 peut être effectuée à l'aide des commandes suivantes:

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

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

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

PhoenixNL72
la source
La commande n ° 1 utilisant des chemins complets: md5sum "$ {dir}" / * ne récupère pas les fichiers cachés à partir de point. Un remède?
user14654
En retard pour la fête, mais comme md5sum veut des noms de fichiers (cela semble être un plaisir si vous lui donnez un répertoire), il serait peut-être plus facile de demander de l'aide: $ md5sum $ (trouvez "$ dir" -maxdepth 0 -type f) Le "- type f "extrait les fichiers normaux et .hidden (aussi, find a beaucoup d’options, mais peut être très utile). Omettez la partie "-maxdepth 0" si vous voulez tout récursivement. Note: ceci est fragile si les noms de fichiers ont des espaces incorporés, alors vous pouvez lire sur xargs et -0 ( en.wikipedia.org/wiki/Xargs )
jgreve
0

J'ai trouvé 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 au plus profond.

Alors, entrez le répertoire dans un shell et exécutez:

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

Cela récupère tous les fichiers du répertoire de niveau supérieur, supprime l’avertissement concernant les sous-répertoires en cours, puis exécute md5sums sur le contenu du sous-répertoire. Avantage: facile à retenir, fait exactement ce que l'on est censé faire. Je suis toujours dérouté par la syntaxe de recherche et je ne peux jamais m'en souvenir, ce qui évite d'avoir à faire une boucle, etc. Pas une solution puissante et robuste, pas valable pour> 1 niveau de sous-répertoires, mais une solution rapide et facile au problème.

Lizardx
la source