44 votes

Sha1sum pour un répertoire de répertoires

sha1sum ./chemin/vers/le/dossier/* | sha1sum 

le code ci-dessus a été posté comme un moyen de calculer un sha1sum d'un dossier qui contient des fichiers. Cette commande échoue si le dossier contient d'autres dossiers. Existe-t-il un moyen de calculer récursivement le sha1sum d'un répertoire de répertoires de manière universelle (sans adapter spécifiquement un algorithme au répertoire particulier en question) ?

51voto

eVoxmusic Points 409

En général, j'aime le modèle find | xargs, comme ceci :

find /chemin/vers/le/dossier -type f -print0 | xargs -0 sha1sum

Vous devez utiliser "-print0" et "-0", au cas où il y aurait des espaces dans les noms de fichiers.

Cependant, c'est très similaire au modèle find -exec cmd {} \;.

Discussion https://stackoverflow.com/questions/896808

19voto

Giuseppe R Points 1325

Merci à ce message SO -

find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum

Attention: Ce code n'a pas été testé! Modifiez cette question s'il est incorrect et que vous pouvez le corriger; j'approuverai votre modification.

5voto

thebunnyrules Points 630

MISE À JOUR: Cela fait quelques années depuis que j'ai posté cette réponse et entre-temps j'ai réécrit et amélioré le script que j'ai présenté ici plusieurs fois. J'ai décidé de reposter le nouveau script comme une toute nouvelle réponse. Je recommande vivement de l'utiliser plutôt que celui-ci.

INTRODUCTION

J'ai observé que l'ordre dans lequel la commande find affiche les éléments trouvés dans un répertoire varie dans des répertoires identiques sur différentes partitions. Si vous comparez les hachages du même répertoire, vous n'avez pas à vous préoccuper de cela, mais si vous obtenez les hachages pour vous assurer qu'aucun fichier n'a été manqué ou corrompu lors d'une copie, vous devez inclure une ligne supplémentaire pour trier le contenu du répertoire et de ses éléments. Par exemple, la réponse de Matthew Bohnsack est assez élégante:

find ./chemin/vers/le/répertoire/ -type f -print0  | xargs -0 sha1sum

Mais si vous l'utilisez pour comparer un répertoire copié à son original, vous enverriez la sortie dans un fichier texte que vous compareriez à la liste de sortie de l'autre répertoire en utilisant Kompare ou WinMerge ou en obtenant simplement les hachages de chaque liste. Le problème est que, comme l'ordre dans lequel l'outil find affichera le contenu peut varier d'un répertoire à un autre, Kompare signalera de nombreuses différences car les hachages n'ont pas été calculés dans le même ordre. Pas grave pour les petits répertoires mais assez ennuyeux si vous traitez avec 30000 fichiers. Par conséquent, vous devez effectuer les étapes supplémentaires de tri de la sortie pour faciliter la comparaison des listes de hachages entre les deux répertoires.

find ./chemin/vers/le/répertoire/ -type f -print0  | xargs -0 sha1sum > sha1sum_list_unsorted.txt
sort sha1sum_list_unsorted.txt > sha1sum_list_sorted.txt

Cela triera la sortie de sorte que les fichiers avec le même hachage seront sur les mêmes lignes lors de l'exécution du programme de différenciation (à condition qu'aucun fichier ne manque dans le nouveau répertoire).

ET MAINTENANT LE SCRIPT...

Voici un script que j'ai écrit. Il fait la même chose que la réponse find/xarg mais triera les fichiers avant d'obtenir le sha1sum (en les gardant dans le même répertoire). La première ligne du script trouve tous les fichiers dans le répertoire de manière récursive. La suivante trie les résultats par ordre alphabétique. Les deux suivantes prennent le contenu trié et ajoutent un sha1sum et des guillemets aux fichiers de la liste triée, créant un grand script shell qui calcule le hachage de chaque fichier, un par un, et l'envoie vers content_sha1sum.txt.

#!/bin/bash
find . -type f > content.txt
sort content.txt > content_sorted.txt
awk '{print "sha1sum \""$0}' content_sorted.txt > temp.txt
awk '{print $0"\""}' temp.txt > get_sha1.sh
chmod +x get_sha1.sh
./get_sha1.sh > content_sha1sum.txt
rm content.txt
rm content_sorted.txt
rm temp.txt
rm get_sha1.sh
xdg-open content_sha1sum.txt

J'espère que cela vous aide.

5voto

Marc M Points 746

Une autre astuce pourrait consister à utiliser tar pour hacher le contenu du fichier et les métadonnées :

tar -cf - ./chemin/vers/le/dossier | sha1sum

2voto

Dan Dascalescu Points 3650

Solution rapide, robuste et portable

Contrairement à certaines autres solutions impliquant tar, la solution ci-dessous fonctionne sur n'importe quelle machine équipée des utilitaires standards Unix, et est plus rapide que toutes les autres solutions en parallélisant le checksum :

find . -type f | xargs -d'\n' -P0 -n1 md5sum | sort -k 2 | md5sum

Comme elle utilise un tri à la fin, il n'y a pas de suivi en temps réel, donc laissez simplement la commande s'exécuter.

Voici ce que font les arguments :

  • find . -type f recherche tous les fichiers dans le répertoire actuel et ses sous-répertoires
  • xargs -d'\n' divise la sortie de la commande find en lignes (si vous vous attendez à avoir des fichiers avec des sauts de ligne, utilisez alors find -print0 | xargs -0)
  • -P0 n1 exécute md5sum en processus parallèles, en utilisant le nombre max de processus supportés par la machine (multi-core !)
  • sort -k 2 trie par le deuxième champ de la sortie md5sum, qui est le chemin complet de chaque fichier (le premier étant le MD5)
  • le dernier md5sum calcule un checksum de la liste de checksums des fichiers, de sorte que vous obtenez un checksum du répertoire entier sur une ligne, que vous pouvez facilement comparer visuellement à travers les fenêtres du terminal

Avant de dire "MD5 a été compromis", pensez à quel est votre modèle de menace. Essayez-vous de vous assurer que les fichiers que vous avez copiés depuis un autre hôte ou disque sont intacts ? Alors MD5 est largement suffisant, car les chances qu'un fichier soit corrompu en transit mais ait le même MD5 sont nulles. Mais si vous craignez qu'un attaquant ait le temps de remplacer un fichier par un autre avec un checksum en collision, alors utilisez sha256sum. L'inconvénient est que les fonctions SHA sont plus lentes que MD5.

Suivi en temps réel et verbose

Enfin, si vous voulez vraiment voir le progrès en temps réel, modifiez la commande pour utiliser un fichier temporaire pour les checksums :

find . -type f | xargs -d\\n -P0 -n1 md5sum | tee /tmp/sums && sort -k 2 /tmp/sums | md5sum

(Notez que déplacer le sort juste après find ne fonctionnerait pas, car xargs -P0 parallélise md5sum, et les résultats peuvent arriver dans le désordre.)

Cette version de la commande vous permet également de diff les deux fichiers /tmp/sums (assurez-vous de renommer le deuxième s'il est sur la même machine) et de voir quels fichiers diffèrent.

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