ire_and_curses la suggestion de l'utilisation de tar c <dir>
a certaines questions:
- de goudron de processus des entrées de répertoire dans l'ordre dans lequel ils sont stockés dans le système de fichiers, et il n'y a aucun moyen de changer cet ordre. Effectivement cela peut donner des résultats complètement différents si vous avez la même arborescence dans des endroits différents, et je ne connais pas de moyen de résoudre ce problème (le goudron ne peut pas "trier" ses fichiers d'entrée dans un ordre particulier).
- J'ai l'habitude de se soucient de savoir si groupid et ownerid nombres sont les mêmes, pas nécessairement de savoir si la représentation de chaîne de groupe/de la propriétaire sont les mêmes. Ceci est en ligne avec ce que par exemple
rsync -a --delete
: il synchronise virtuellement tout (moins xattrs et acl), mais la synchronisation de propriétaire et de groupe en fonction de leur ID, et non sur la représentation de chaîne. Donc, si vous avez synchronisé à un autre système qui n'a pas nécessairement les mêmes utilisateurs/groupes, vous devez ajouter l' --numeric-owner
drapeau de goudron
- tar comprendra le nom du répertoire que vous êtes à la vérification elle-même, quelque chose d'être conscient de.
Tant qu'il n'y a pas de solution pour le premier problème (ou si vous êtes sûr qu'il ne vous affecte pas), je ne voudrais pas utiliser cette approche.
L' find
en fonction des solutions proposées ci-dessus ne sont pas bons parce qu'ils comprennent uniquement les fichiers, pas les répertoires, qui devient un problème si vous le calcul des sommes de contrôle doivent garder à l'esprit les répertoires vides.
Enfin, la plupart des solutions proposées ne trie pas systématiquement, car le classement peut être différent entre les systèmes.
C'est la solution je suis venu avec:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
Notes à propos de cette solution:
- L'
LC_ALL=C
est d'assurer la fiabilité de l'ordre de tri dans l'ensemble des systèmes
- Cela ne fait pas de différence entre un répertoire "nommé\nwithanewline" et deux répertoires "nommé" et "withanewline", mais la chance que ça se produisant semble très peu probable. On fixe habituellement avec un
-print0
drapeau pour find
, mais depuis il y a d'autres choses qui se passent ici, je ne peux que voir les solutions qui permettraient de rendre la commande plus compliqué alors il vaut la peine.
PS: un de mes systèmes d'utilisations limité busybox find
qui ne prend pas en charge -exec
ni -print0
drapeaux, et aussi il ajoute '/' pour désigner les répertoires, tandis que findutils trouver ne semble pas, donc, pour cette machine, j'ai besoin d'exécuter:
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
Heureusement, je n'ai pas de fichiers/répertoires avec des sauts de ligne dans leurs noms, ce n'est pas un problème sur le système.