145 votes

Linux : calculer un hachage unique pour un dossier et un contenu donnés ?

Il doit bien y avoir un moyen de le faire facilement !

J'ai essayé les applications de ligne de commande Linux telles que sha1sum y md5sum mais ils ne semblent capables que de calculer les hachages de fichiers individuels et de produire une liste de valeurs de hachage, une pour chaque fichier.

J'ai besoin de générer un hachage unique pour l'ensemble du contenu d'un dossier (pas seulement les noms de fichiers).

J'aimerais faire quelque chose comme

sha1sum /folder/of/stuff > singlehashvalue

Editer : pour clarifier, mes fichiers sont à plusieurs niveaux dans une arborescence de répertoires, ils ne sont pas tous dans le même dossier racine.

182voto

Vatine Points 8884

Une solution possible serait la suivante :

sha1sum path/to/folder/\* | sha1sum

S'il y a toute une arborescence de répertoires, il vaut mieux utiliser find et xargs. Une commande possible serait

find path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum

Enfin, si vous devez également tenir compte des autorisations et des répertoires vides :

(find path/to/folder -type f -print0  | sort -z | xargs -0 sha1sum;
 find path/to/folder \( -type f -o -type d \) -print0 | sort -z | \
   xargs -0 stat -c '%n %a') \
| sha1sum

Les arguments en faveur de stat lui fera afficher le nom du fichier, suivi de ses permissions octales. Les deux recherches seront exécutées l'une après l'autre, ce qui doublera la quantité d'E/S disque, la première trouvant tous les noms de fichiers et vérifiant le contenu, la seconde trouvant tous les noms de fichiers et de répertoires, imprimant le nom et le mode. La liste des "noms de fichiers et des sommes de contrôle", suivie des "noms et répertoires, avec les permissions" sera ensuite vérifiée, pour une somme de contrôle plus petite.

45voto

David Schmitt Points 29384
  • Utilisez un outil de détection des intrusions dans le système de fichiers tel que aide .

  • hacher une boule de tar du répertoire :

    tar cvf - /path/to/folder | sha1sum

  • Codez vous-même quelque chose, comme oneliner de vatine :

    find /path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum

21voto

Shumoapp Points 111

Si vous voulez simplement vérifier si quelque chose a changé dans le dossier, je vous recommande celui-ci :

ls -alR --full-time /folder/of/stuff | sha1sum

Il vous donnera simplement un hachage de la sortie de ls, qui contient les dossiers, les sous-dossiers, leurs fichiers, leur horodatage, leur taille et leurs autorisations. Pratiquement tout ce dont vous avez besoin pour déterminer si quelque chose a changé.

Veuillez noter que cette commande ne génère pas de hachage pour chaque fichier, mais c'est la raison pour laquelle elle devrait être plus rapide que l'utilisation de find.

16voto

S.Lott Points 207588

Vous pouvez faire tar -c /path/to/folder | sha1sum

16voto

Wang Points 434

Jusqu'à présent, la méthode la plus rapide reste le goudron. Et avec quelques paramètres supplémentaires, nous pouvons également nous débarrasser de la différence causée par les métadonnées.

Pour utiliser GNU tar pour hacher le répertoire, il faut assurez-vous de trier le chemin d'accès pendant le goudron, sinon il est toujours différent.

tar -C <root-dir> -cf - --sort=name <dir> | sha256sum

ignorer l'heure

Si vous ne vous souciez pas du temps d'accès ou de modification, utilisez également quelque chose comme --mtime='UTC 2019-01-01' pour s'assurer que tous les horodatages sont identiques.

ignorer la propriété

En général, il faut ajouter --group=0 --owner=0 --numeric-owner pour unifier les métadonnées du propriétaire.

ignorer certains fichiers

utiliser --exclude=PATTERN

il est connu que certains goudrons n'ont pas --sort Assurez-vous d'avoir GNU tar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X