La meilleure façon de comparer (diff) une structure de répertoires complète?


29

Quelle est la meilleure façon de comparer les structures de répertoires?

J'ai un utilitaire de sauvegarde qui utilise rsync . Je veux dire les différences exactes (en termes de tailles de fichiers et de dates de dernière modification) entre la source et la sauvegarde.

Quelque chose comme:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

Bien sûr, l'outil peut être prêt à l'emploi ou une idée de script python.

Merci beaucoup!

Udi

Réponses:


18

L'outil que vous recherchez est rdiff . Cela fonctionne comme la combinaison de rsync et diff. Il crée un fichier patch que vous pouvez comparer ou distribuer.


9

Certaines personnes veulent comparer des systèmes de fichiers pour différentes raisons, je vais donc écrire ici ce que je voulais et comment je l'ai fait.

Je voulais:

  • Pour comparer le même système de fichiers avec lui-même, c'est-à-dire, instantané , apportez des modifications , instantané , comparez .
  • Une liste de quels fichiers ont été ajoutés ou supprimés, ne se souciait pas des changements de fichiers internes.

Ce que j'ai fait:

Premier instantané ( before.shscript):

find / -xdev | sort > fs-before.txt

Deuxième instantané ( after.shscript):

find / -xdev | sort > fs-after.txt

Pour les comparer ( diff.shscript):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

La bonne partie est que cela utilise à peu près les binaires système par défaut. Le faire comparer en fonction du contenu pourrait être fait en passant findun -execparamètre qui fait écho au chemin du fichier et un MD5 après cela.


8

si vous n'avez pas envie d'installer un autre outil ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

Et oui, cela pourrait être fait avec find et exec ou find et xargs aussi facilement que find dans une boucle for. Et, aussi, vous pouvez améliorer la sortie de diff pour qu'il dise des choses comme "ce fichier est sur host1 mais pas host2" ou d'autres, mais à ce stade, vous pouvez tout aussi bien installer les outils dont tout le monde parle ...


5

J'ai utilisé dirdiff dans le passé pour comparer les structures de répertoires. Il ne fonctionne que sur les sshfsrépertoires locaux, vous devrez donc monter vos autres répertoires.

La bonne chose est que vous pouvez voir visuellement si les fichiers sont égaux ou non et lequel est plus récent ou plus ancien. Et il prend en charge jusqu'à 5 répertoires. Vous pouvez également voir les différences et copier des fichiers de l'un à l'autre.


4

Depuis la page de manuel de rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

Peut-être que cela vous aidera.


Merci, mais cela ne résout pas mon problème (je cherche le diff pour vraiment faire la différence).
Adam Matan

4

diff -rfonctionne en fait assez bien. Si vous voulez simplement savoir si les fichiers diffèrent, pas le contenu réel des différences, alors faitesdiff -qr


1
-rsignifie récursif, il ne se connecte pas à un hôte distant!
Michael Hampton

3

J'utiliserais Meld pour ça.


Meld fonctionne très bien pour cela si vous voulez une solution GUI.
Drew Noakes

2

Outre les outils déjà mentionnés sur Windows, vous pouvez utiliser Total Commander ou WinSCP, les deux ont des fonctions très confortables pour comparer (et synchroniser) les répertoires.


0

Je ne voulais pas vraiment installer quoi que ce soit de nouveau, donc ma solution est un peu grossière, mais rapide et efficace.

Je voulais comparer tous les fichiers ont été copiés et leur mode de fichier, la propriété et le contexte de sécurité SELinux restent non synchronisés.

J'ai donc couru:

rsync -aX /orig /copy/

puis comparer comme ceci:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Si le contenu des deux fichiers reste réduit, ils sont identiques. Sinon, le diff s'affiche.

Mettez à jour les paramètres de lspour refléter les attributs que vous devez vérifier. YMMV

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.