J'ai besoin de calculer une somme de contrôle md5 récapitulative pour tous les fichiers d'un type particulier ( *.py
par exemple) placés sous un répertoire et tous les sous-répertoires.
Quelle est la meilleure façon de le faire?
Edit: Les solutions proposées sont très sympas, mais ce n'est pas exactement ce dont j'ai besoin. Je recherche une solution pour obtenir une somme de contrôle récapitulative unique qui identifiera de manière unique le répertoire dans son ensemble, y compris le contenu de tous ses sous-répertoires.
Réponses:
La commande find répertorie tous les fichiers qui se terminent par .py. La somme md5 est calculée pour chaque fichier .py. awk est utilisé pour sélectionner les md5sums (en ignorant les noms de fichiers, qui peuvent ne pas être uniques). Les md5sums sont triés. La somme md5 de cette liste triée est ensuite renvoyée.
J'ai testé cela en copiant un répertoire de test:
J'ai renommé certains des fichiers dans ~ / pybin2.
La
find...md5sum
commande renvoie la même sortie pour les deux répertoires.la source
awk ...
partie si vous considérez la mise en page comme une partie de la signature.Créez un fichier d'archive tar à la volée et dirigez-le vers
md5sum
:Cela produit une seule somme md5 qui doit être unique à votre configuration de fichier et de sous-répertoire. Aucun fichier n'est créé sur le disque.
la source
ls -alR dir | md5sum
. C'est encore mieux sans compression juste une lecture. Il est unique car le contenu contient l'heure de modification et la taille du fichier;)z
pour gzip ouj
pour bzip2. Je n'ai fait ni l'un ni l'autre.tar
ingérer le même ensemble de fichiers deux fois, ou sur deux ordinateurs différents, produira exactement le même résultat.La suggestion d'utiliser ire_and_curses pose
tar c <dir>
quelques problèmes:rsync -a --delete
: il synchronise pratiquement tout (moins xattrs et acls), mais il synchronisera le propriétaire et le groupe en fonction de leur ID, pas sur la représentation sous forme de chaîne. Donc, si vous avez synchronisé avec un système différent qui n'a pas nécessairement les mêmes utilisateurs / groupes, vous devez ajouter l'--numeric-owner
indicateur à tarTant qu'il n'y a pas de solution pour le premier problème (ou à moins que vous ne soyez sûr que cela ne vous affecte pas), je n'utiliserais pas cette approche.
Les
find
solutions basées proposées ci-dessus ne sont pas non plus bonnes car elles n'incluent que des fichiers, pas des répertoires, ce qui devient un problème si la somme de contrôle doit garder à l'esprit les répertoires vides.Enfin, la plupart des solutions suggérées ne trient pas de manière cohérente, car le classement peut être différent d'un système à l'autre.
Voici la solution que j'ai trouvée:
Remarques sur cette solution:
LC_ALL=C
est d'assurer un ordre de tri fiable entre les systèmes-print0
indicateur pour,find
mais comme il se passe d'autres choses ici, je ne peux voir que des solutions qui rendraient la commande plus compliquée que ça en vaut la peine.PS: l'un de mes systèmes utilise une busybox limitée
find
qui ne prend pas en charge-exec
ni les-print0
indicateurs, et ajoute également '/' pour désigner les répertoires, alors que findutils ne semble pas le faire, donc pour cette machine, je dois exécuter:Heureusement, je n'ai pas de fichiers / répertoires avec des nouvelles lignes dans leurs noms, donc ce n'est pas un problème sur ce système.
la source
Si vous ne vous souciez que des fichiers et non des répertoires vides, cela fonctionne bien:
la source
Par souci d'exhaustivité, il y a md5deep (1) ; il n'est pas directement applicable en raison de l'exigence de filtre * .py mais devrait fonctionner avec find (1).
la source
Une solution qui a fonctionné le mieux pour moi:
Raison pour laquelle cela a fonctionné le mieux pour moi:
Problèmes avec d'autres réponses:
Les métadonnées du système de fichiers ne sont pas ignorées pour:
tar c - "$path" | md5sum
Ne gère pas les noms de fichiers contenant des espaces et ne détecte pas si le fichier a été renommé:
la source
Si vous voulez un md5sum couvrant tout le répertoire, je ferais quelque chose comme
la source
cat **.py
| md5sumSomme de contrôle de tous les fichiers, y compris le contenu et leurs noms de fichiers
Identique à ci-dessus, mais n'incluant que les fichiers * .py
Vous pouvez également suivre des liens symboliques si vous le souhaitez
Autres options que vous pourriez envisager d'utiliser avec grep
la source
Trouver GNU
la source
Techniquement, il vous suffit de courir
ls -lR *.py | md5sum
. À moins que vous ne craigniez que quelqu'un modifie les fichiers et les ramène à leurs dates d'origine et ne change jamais la taille des fichiers, la sortie dels
devrait vous dire si le fichier a changé. Mon unix-foo est faible donc vous aurez peut-être besoin de plus de paramètres de ligne de commande pour obtenir l'heure de création et l'heure de modification à imprimer.ls
vous dira également si les autorisations sur les fichiers ont changé (et je suis sûr qu'il existe des commutateurs pour désactiver cela si vous ne vous souciez pas de cela).la source
touch
un fichier pour changer sa date (mais pas son contenu), alors je m'attendrais à ce que la somme de contrôle soit inchangée.Utilisation
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
la source
J'ai eu le même problème alors j'ai créé ce script qui répertorie simplement les md5sums des fichiers dans le répertoire et s'il trouve un sous-répertoire, il s'exécute à nouveau à partir de là, pour que cela se produise, le script doit être capable de parcourir le courant répertoire ou d'un sous-répertoire si ledit argument est passé dans $ 1
la source
Si vous voulez vraiment être indépendant des attributs du système de fichiers et des différences au niveau du bit de certaines versions tar, vous pouvez utiliser cpio:
la source
Il existe deux autres solutions:
Créer:
Vérifier:
la source
md5sum
a bien fonctionné pour moi, mais j'ai eu des problèmes avecsort
et de tri des noms de fichiers. Donc, à la place, j'ai trié parmd5sum
résultat. J'avais également besoin d'exclure certains fichiers afin de créer des résultats comparables.find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum
la source