Comment puis-je facilement confirmer sous Linux que deux répertoires distincts ont exactement le même contenu?

8

CentOS 5.x

La question Mq semblait similaire à celle-ci mais je n'étais pas sûr ...

J'ai deux serveurs (complètement isolés l'un de l'autre), chacun avec un répertoire et des sous-répertoires qui devraient avoir le même contenu exact.

Par exemple, la disposition du répertoire pourrait être quelque chose comme:

SERVEUR A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

SERVEUR B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

Idéalement, je voudrais un moyen de faire une vérification récursive et d'avoir quelque chose qui confirme que tout correspond.

Je souhaite également éviter d'utiliser des outils tiers.

Des idées?

Mike B
la source
Souhaitez-vous simplement comparer les deux répertoires ou en faire l'un en double?
Scott Pack
@ScottPack Grande question. Je veux comparer mais NE PAS faire de changements. Quelque chose d'autre gère la réplication des répertoires. Je veux juste m'assurer qu'il fait son travail.
Mike B
1
Vous avez déjà tagué cette question rsync? Alors ... euh, utiliser rsync(avec -noption)?
faker
@faker Je pensais que rsync pourrait être l'option mais je ne savais pas s'il y avait quelque chose de mieux, de plus facile ou de plus spécifique à ce cas d'utilisation. J'ai besoin de savoir que les noms de fichiers, la date, la taille et l'emplacement relatif correspondent.
Mike B
notez que rsync ne vérifie pas le contenu du fichier si l'heure et la taille correspondent, voir l'option --checksum si cela vous inquiète
ragoût

Réponses:

9

Une bonne façon consiste à utiliser md5sums sur chaque fichier de l'arborescence:

Exécutez ceci sur server1:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Exécutez ceci sur server2

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Ensuite, comparez simplement les deux fichiers (en utilisant diff) ou ce que vous voulez.

Cela correspond-il à ce que vous recherchez?

Bien sûr, vous pouvez utiliser SSH pour exécuter la commande à distance si vous le souhaitez.

Camden S.
la source
Merci Camden. Oui, je pense que c'est ce que je cherchais. Je vais le tester et voir si ça marche.
Mike B
2
Ou md5sum les md5sums
dmourati
Excellent - à droite, si vous ne vous souciez pas de savoir quels fichiers changent, vous pouvez simplement additionner les fichiers résultants et comparer ces deux sommes.
Camden S.Le
En outre, vous le savez probablement déjà, mais pour exécuter cette commande à distance via SSH, vous devez simplement le fairessh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.
1
MikeB, en exécutant une liste longue récursive et en la transmettant à md5sum, vous obtiendrez une md5sum de la liste de répertoires, ce qui exclura le contenu des fichiers. Si la taille des inodes des systèmes de fichiers à chaque extrémité était différente, cela pourrait très bien créer une différence de taille de fichier également. Faire une somme md5 sur le contenu comme suggéré à l'origine par @CamdenS. est mieux.
nearora
7

Si vous ne vous souciez pas nécessairement de ce qui a changé, juste que quelque chose a changé, rsync est toujours très bon pour cela. Essayez d'exécuter cette commande et jetez un œil à la sortie, en supposant qu'elle est exécutée à partir de 'servera'.

rsync -avcn /opt/foo/ serverb:/opt/foo

La liste résultante sera les fichiers qui auraient été modifiés si vous aviez réellement exécuté le processus de synchronisation. Gardant à l'esprit que les fichiers apparaîtront dans la liste même si seul l'horodatage a changé, mais le contenu est resté le même. Depuis que nous avons ajouté le -ndrapeau, aucune action ne sera réellement effectuée, uniquement signalée.

Scott Pack
la source
Merci. Et si les deux boîtes sont complètement isolées l'une de l'autre? Comment puis-je utiliser la sortie pour comparer?
Mike B
rsync ne prend pas en charge à la fois la source et la destination pour être distant, il devra donc l'exécuter sur l'un de ses serveurs
faker
@faker: Je dois l'admettre, je n'ai jamais essayé cela auparavant, bon à savoir. Comme vous le dites, cependant, il est assez facile d'en tenir compte.
Scott Pack
+1. Utilisation intelligente de rsync. Pour être complètement correct, cependant, vous devez exécuter le rsyncdans les deux directions. Autrement dit, vous devez ajouter ceci:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven lundi
5

Bien que vous puissiez pirater ensemble un script rapide qui calculera les hachages MD5 individuels pour les fichiers individuels dans un répertoire, la meilleure façon de le faire serait d'utiliser un outil appelé md5deepqui calculera récursivement les hachages de tous les fichiers dans un répertoire, puis sortira les dans un fichier. Il peut ensuite être utilisé sur un autre répertoire, en prenant le premier fichier de hachage en entrée et en vous fournissant une liste de fichiers différents entre les deux répertoires.

Donc, en prenant votre exemple, vous suivriez ce processus:

  1. Calculez les hachages du répertoire requis sur le serveur A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Copiez le fichier file_hashes.txtsur le serveur B pour comparaison.

  3. Calculez les hachages du répertoire requis sur le serveur B, mais en prenant les hachages de fichiers du serveur A comme fichier d'entrée en utilisant l' -xindicateur pour n'afficher que les fichiers différents:

    md5deep -x file_hashes.txt -r /opt/foo/

L'ensemble d'outils md5deep fait partie du système de gestion de packages de la plupart des distributions, et la grande chose est qu'il prend en charge un certain nombre d'algorithmes de hachage différents, pas seulement MD5. Donc, si vous êtes paranoïaque à propos des collisions, vous avez un certain nombre d'alternatives disponibles. Les outils suivants font partie de md5deep, chacun fournissant un algorithme de hachage alternatif:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests
Richard Keller
la source
0

J'ai utilisé une technique similaire à @ scott-pack. Cela vous donnera une différence dans les deux sens. Tout ce qui commence par "supprimer" est un fichier qui se trouve sur le serveur distant mais pas sur le serveur local. Chaque répertoire répertorié sans aucun contenu de fichier est celui qui n'a aucune modification. Chaque fichier répertorié est un fichier qui n'existe pas sur le serveur distant ou la version locale est "plus récente".

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
David Baucum
la source