sha1sum ./path/to/directory/* | sha1sum
ce qui précède a été publié comme un moyen de calculer un sha1sum d'un répertoire qui contient des fichiers. Cette commande échoue si le répertoire comprend plus de répertoires. Existe-t-il un moyen de calculer récursivement le sha1sum d'un répertoire de répertoires universellement (sans ajustement personnalisé d'un algorithme au répertoire particulier en question)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticJ'aime généralement le modèle "find | xargs", comme ceci:
Vous devez utiliser "-print0" et "-0", au cas où il y aurait des espaces dans les noms de fichiers.
Cependant, ceci est très similaire au modèle "find -exec cmd {}".
Voir une discussion comparant les deux modèles ici: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
la source
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.MISE À JOUR: Cela fait quelques années que je n'ai pas posté cette réponse et en attendant j'ai réécrit et amélioré le script que j'ai présenté ici plusieurs fois. J'ai décidé de republier le nouveau script comme une toute nouvelle réponse. Je le recommande vivement par rapport à celui-ci.
INTRODUCTION
J'ai observé que l'ordre dans lequel la commande find génère les éléments trouvés dans un répertoire varie au sein de répertoires identiques sur différentes partitions. Si vous comparez les hachages du même répertoire, vous n'avez pas à vous en soucier, 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 ses éléments. Par exemple, la réponse de Matthew Bohnsack est assez élégante:
Mais si vous l'utilisez pour comparer un répertoire copié à son original, vous enverriez la sortie dans un fichier txt que vous compareriez à la liste sortie de l'autre répertoire en utilisant Kompare ou WinMerge ou en obtenant simplement les hachages de chaque lis . Le fait est que l'ordre dans lequel l'outil de recherche affichera le contenu peut varier d'un répertoire à l'autre, Kompare signalera de nombreuses différences car les hachages n'ont pas été calculés dans le même ordre. Pas un gros problème 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 hachage entre les deux répertoires.
Cela trierait la sortie afin que les fichiers avec le même hachage soient 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 SUR LE SCRIPT ...
Voici un script que j'ai écrit. Il fait la même chose que la réponse find / xarg, mais il triera les fichiers avant d'obtenir le sha1sum (en les conservant dans le même répertoire). La première ligne du script recherche récursivement tous les fichiers du répertoire. Le suivant trie les résultats par ordre alphabétique. Les deux suivants prennent le contenu trié et ajoutent un sha1sum et des guillemets aux fichiers de la liste triée, créant un gros script shell qui calcule chaque hachage de fichiers, un à la fois et le génère dans content_sha1sum.txt.
J'espère que cela t'aides.
la source
sort -z
(--zero-terminated
) que de jouer avec un tas de fichiers.INTRODUCTION
Il y a quelques années, j'ai écrit et présenté (dans ce fil même) un script qui peut vérifier les signatures de hachage de tous les fichiers individuels dans la structure de répertoires actuelle et les afficher sous forme de liste dans un fichier texte.
Depuis, j'ai raffiné cette formule plusieurs fois. J'ai décidé de republier mon nouveau script amélioré ici comme réponse distincte. Il est écrit pour sha256 mais toute personne souhaitant toujours utiliser sha1 peut faire une recherche simple et remplacer dans gedit pour échanger sha256 avec sha1. Personnellement, je n'ai pas utilisé sha1 depuis quelques années et je ne le recommanderais pas car il est devenu obsolète et Google a montré comment il pouvait être compromis .
Voici ce que fait mon nouveau script:
Vous pouvez simplement utiliser le script en allant dans le répertoire que vous souhaitez hacher et en entrant:
Alternativement, vous pouvez appeler ce script à partir d'un autre répertoire en faisant:
Le script détectera si vous avez des privilèges d'écriture dans le répertoire actuel. Si vous le faites, les résultats seront enregistrés dans le répertoire actuel. Si vous ne disposez pas de privilèges d'écriture ou si votre répertoire actuel se trouve dans un système en lecture seule (tel qu'un cdrom), les résultats seront enregistrés dans le répertoire de base de l'utilisateur actuel.
Le script détectera si certains des sous-répertoires ne sont pas accessibles avec les privilèges d'utilisateur actuels. Si tous sont lisibles, aucune élévation de privilège n'a lieu, sinon, les privilèges de l'utilisateur sont élevés à la racine.
Find est utilisé pour rechercher tous les fichiers dans la structure dir actuelle (y compris tous les sous-répertoires). Le tri est utilisé pour s'assurer que les résultats sont sortis par ordre alphabétique. La liste résultante subit sha256sum et est sortie dans un fichier texte.
Depuis l'écriture de l'ancien script, j'ai adopté une philosophie de conception selon laquelle les fichiers temporaires sont malveillants et doivent être évités autant que possible car ils laissent les utilisateurs ouverts à l'espionnage et à la falsification par des tiers malveillants. Ainsi, toutes les données de ce nouveau script sont manipulées en tant que variables jusqu'à la toute dernière minute où les résultats sont sortis sous forme de fichier texte.
Le fichier résultant lui-même est haché et le chemin / hachage est sorti dans le terminal. J'aime prendre des photos de ces hachages avec un appareil photo hors ligne de la vieille école pour pouvoir m'assurer que le fichier de résultats n'a pas été falsifié lorsque je m'en réfère à une date ultérieure.
Les anciens fichiers de résultats sont ignorés dans le décompte. Cela facilite la comparaison des résultats.
Voici un exemple de la sortie du terminal lors de l'exécution de mon script:
Voici un extrait de la sortie qui se trouve dans 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:
(ça continue pour encore 7000+ lignes comme ça mais vous avez l'idée)
INSTALLATION
Ouvrez un terminal et entrez les commandes suivantes:
Dans nano, utilisez Shif + Ctrl + v pour coller. Ctrl-O et Entrée pour enregistrer. Ctr-X se ferme. Collez mon script là-dedans:
(coller après le #! / bin / bash)
Lorsque vous quittez nano, assurez-vous de quitter le statut élevé en entrant:
DERNIÈRES PENSÉES
Cela ne fonctionnera que si vous avez installé bash. J'ai utilisé un synthax pour la manipulation de sous-chaînes qui ne fonctionne pas avec sh, dash, ksh ou zsh. Vous pouvez toujours utiliser n'importe lequel des autres shells comme pilotes quotidiens, mais bash doit être installé.
Les listes produites peuvent être comparées à une variété d'outils tels que: (dans le terminal) diff, sdiff (et graphique) diffuse, kdiff, winmerge.
Mon fichier trie la sortie en fonction du chemin d'accès, pour le rendre plus facile à lire par les humains. J'ai remarqué que la commande de tri fonctionnait différemment selon les différentes distributions. Par exemple, dans une distribution, les lettres MAJUSCULES ont priorité sur les non-majuscules et dans l'autre non. Cela affecte l'ordre des lignes des fichiers de sortie et pourrait rendre les fichiers difficiles à comparer. Cela ne devrait poser aucun problème si vous utilisez toujours le script dans la même distribution, mais cela peut se produire si des listes de hachages ont été générées dans deux environnements différents. Ceci est facilement résolu en triant les fichiers de hachage une fois supplémentaire afin que les lignes soient ordonnées par hachage plutôt que par chemin:
la source
#!/usr/bin/env bash
- elle trouvera également Bash dans d'autres répertoires, car ce dernier peut être installé dans / usr / bin plutôt que / bin , par exemple, pendant ce temps, env a tendance à être dans / usr / bin à tout moment autant que je l'ai remarqué. Il convient également de noter que, puisque vous avez besoin de Bash, vous pouvez utiliser[[ blah-blah ]]
une expression conditionnelle à double crochet au lieu d'une[ blah-blah ]
variante plus générique à simple crochet.Cela semble fonctionner pour moi:
EDIT: cela ne fera que la somme de tous les fichiers contenus dans l'arborescence des répertoires. Si le nom d'un répertoire était changé, cela ne l'attraperait pas. Peut-être quelque chose comme:
Je le ferais. À peu près la même réponse que l'autre
la source
Une autre astuce pourrait être d'utiliser tar pour hacher le contenu et les métadonnées du fichier:
la source
Solution rapide, robuste et portable
Contrairement à certaines des autres solutions impliquant
tar
, la solution ci-dessous fonctionne sur n'importe quelle machine disposant des utilitaires Unix standard et est plus rapide que toutes les autres solutions en parallélisant la somme de contrôle:Puisqu'il utilise un tri à la fin, il n'y a pas de progression en temps réel, alors laissez la commande s'exécuter.
Voici ce que font les arguments:
find . -type f
trouve tous les fichiers dans le répertoire courant et ses sous-répertoiresxargs -d'\n'
divise la sortie de find en lignes (si vous vous attendez à avoir des fichiers contenant des retours à la ligne, faites comme d'habitudefind -print0 | xargs -0
)-P0 n1
s'exécutemd5sum
dans des processus parallèles, en utilisant le nombre maximum de processus pris en charge par la machine (multicœur!)sort -k 2
trie par le deuxième champ de lamd5sum
sortie, qui est le chemin d'accès complet à chaque fichier (le premier est le MD5)md5sum
calcule une somme de contrôle de la liste des sommes de contrôle de fichier, de sorte que vous obtenez une somme de contrôle de l'ensemble du répertoire sur une seule ligne, que vous pouvez facilement comparer visuellement à travers les fenêtres de terminalAvant de dire que «MD5 a été compromis», n'oubliez pas quel est votre modèle de menace. Essayez-vous de vous assurer que les fichiers que vous avez copiés à partir d'un autre hôte ou disque sont arrivés intacts? Alors MD5 est plus que suffisant, car les chances qu'un fichier soit corrompu en transit mais ayant le même MD5 sont nulles. Mais si vous avez peur qu'un attaquant ait le temps de remplacer un fichier par un autre avec une somme de contrôle en collision, alors utilisez
sha256sum
. L'inconvénient est que les fonctions SHA sont plus lentes que MD5 .Progression détaillée en temps réel
Enfin, si vous souhaitez voir la progression en temps réel, modifiez le pipeline pour utiliser un fichier temporaire pour les sommes de contrôle:
(Notez que déplacer la
sort
droite aprèsfind
ne fonctionnerait pas, carxargs -P0
parallélisemd5sum
et les résultats peuvent arriver dans le désordre.)Cette version de la commande vous permet également de différencier les deux
/tmp/sums
fichiers (assurez-vous de renommer le second s'il se trouve sur la même machine) et de voir quels fichiers diffèrent.la source
Plutôt que d'avoir UN énorme fichier contenant toutes les informations hachées, je cherchais un moyen de créer un fichier dans chaque dossier d'une arborescence. Je me suis inspiré des commentaires ici. Le mien est un peu plus complexe que ce qui est affiché ici. J'utilise la rotation des fichiers mais c'est la moins complexe pour les nouveaux joueurs. Cette version fera écraser les anciennes sommes de contrôle par de nouvelles. Il peut être bon de conserver 2 ou 3 versions selon la fréquence à laquelle vous l'exécutez et votre besoin de «profondeur».
Notez que mkshaindir, pour mes besoins, est un composant distinct, car il peut être nécessaire de créer un hachage de fichiers dans un nouveau dossier ou d'un fichier récemment modifié. Tout cela peut être combiné en un seul script si nécessaire.
Le reste est laissé comme exercice au lecteur.
la source
basé sur la réponse précédente :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
la source
@allquixotic
La réponse de ne génère pas les mêmes hachages sur différentes machines, ce qui ne nous aidera pas à vérifier et à avoir des hachages cohérents.La ligne
find . -type f \( -exec md5sum "$PWD"/{} \; \)
suivante renvoie la sortie suivante:Par conséquent, le chemin serait différent sur différentes machines.
awk '{print $1}'
nous aidera à obtenir la première colonne, qui n'a que le hachage des fichiers. Plus tard, nous devons trier ces hachages, où l'ordre peut être différent sur différentes machines, ce qui peut également nous amener à avoir des hachages différents s'il y a plus de deux fichiers.Solution:
Pour Mac:
Pour Linux:
la source