La bonne manière dépend exactement de la raison pour laquelle vous demandez:
Option 1: Comparer uniquement les données
Si vous avez juste besoin d'un hachage du contenu du fichier de l'arborescence, ceci fera l'affaire:
$ find -s somedir -type f -exec md5sum {} \; | md5sum
Ceci résume d'abord tout le contenu du fichier individuellement, dans un ordre prévisible, puis transmet cette liste de noms de fichiers et de hachages MD5, en donnant une valeur unique qui ne change que lorsque le contenu d'un des fichiers de l'arborescence est modifié.
Malheureusement, find -s
fonctionne uniquement avec BSD find (1), utilisé dans macOS, FreeBSD, NetBSD et OpenBSD. Pour obtenir quelque chose de comparable sur un système avec GNU ou SUS find (1), vous avez besoin de quelque chose d'un peu plus laid:
$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum
Nous avons remplacé find -s
par un appel à sort
. Le -k 2
bit lui dit de sauter le hachage MD5, donc il ne trie que les noms de fichiers, qui se trouvent dans les champs 2 à la fin de la ligne, en fonction sort
du compte rendu.
Cette version de la commande présente un point faible: elle risque de devenir confuse si vous avez des noms de fichiers contenant des nouvelles lignes, car cela ressemblera à plusieurs lignes à l' sort
appel. La find -s
variante n’a pas ce problème, car la traversée et le tri de l’arbre ont lieu dans le même programme find
,.
Dans les deux cas, le tri est nécessaire pour éviter les faux positifs: les systèmes de fichiers Unix / Linux les plus courants ne conservent pas les listes de répertoires dans un ordre stable et prévisible. Vous pourriez ne pas vous en rendre compte en utilisant ls
, etc., qui trient le contenu du répertoire pour vous. find
sans -s
ou un sort
appel imprimera les fichiers dans l'ordre de leur retour par le système de fichiers sous-jacent, ce qui donnera à cette commande une valeur de hachage modifiée si l'ordre des fichiers qui lui est donné en entrée change.
Vous devrez peut-être modifier les md5sum
commandes md5
ou une autre fonction de hachage. Si vous choisissez une autre fonction de hachage et que vous avez besoin de la seconde forme de la commande pour votre système, vous devrez peut-être ajuster la sort
commande en conséquence. Un autre piège est que certains programmes de sommation de données n'écrivent pas du tout de nom de fichier, un bon exemple étant l'ancien sum
programme Unix .
Cette méthode est quelque peu inefficace, appelant md5sum
N + 1 fois, où N est le nombre de fichiers de l’arborescence, mais c’est un coût nécessaire pour éviter le hachage des métadonnées de fichiers et de répertoires.
Option 2: Comparer les données et les métadonnées
Si vous devez être en mesure de détecter que quelque chose dans une arborescence a changé, pas seulement le contenu du fichier, demandez tar
de compacter le contenu du répertoire, puis envoyez-le à md5sum
:
$ tar -cf - somedir | md5sum
Parce que tar
voit également les autorisations de fichiers, la propriété, etc., cela détectera également les modifications apportées à ces éléments, pas uniquement les modifications apportées au contenu du fichier.
Cette méthode est considérablement plus rapide, puisqu'elle ne fait qu'un seul passage sur l'arborescence et n'exécute le programme de hachage qu'une seule fois.
Comme avec la find
méthode basée ci-dessus, tar
va traiter les noms de fichiers dans l'ordre dans lequel le système de fichiers sous-jacent les renvoie. Il se peut que dans votre application, vous puissiez être sûr que cela ne se produise pas. Je peux penser à au moins trois modèles d'utilisation différents où cela est susceptible d'être le cas. (Je ne vais pas les énumérer, car nous entrons dans un territoire de comportement non spécifié. Chaque système de fichiers peut être différent ici, même d'une version du système d'exploitation à l'autre.)
Si vous trouvez des faux positifs, je vous conseillerais de find | cpio
choisir l' option dans la réponse de Gilles .
find .
place defind somedir
. De cette façon, les noms de fichier sont les mêmes lorsque vous fournissez différentes spécifications de chemin à rechercher; cela peut être délicat :-)