Der beste Weg, eine vollständige Verzeichnisstruktur zu vergleichen (diff)?


29

Wie lassen sich Verzeichnisstrukturen am besten vergleichen?

Ich habe ein Backup-Dienstprogramm, das Rsync verwendet . Ich möchte die genauen Unterschiede (in Bezug auf Dateigröße und Datum der letzten Änderung) zwischen der Quelle und dem Backup feststellen.

So etwas wie:

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

Natürlich kann das Tool vorgefertigt sein oder eine Idee für ein Python-Skript.

Danke vielmals!

Udi

Antworten:


18

Das Tool, das Sie suchen, ist rdiff . Es funktioniert wie das Kombinieren von Rsync und Diff. Es wird eine Patch-Datei erstellt, die Sie vergleichen oder verteilen können.


9

Einige Leute wollen Dateisysteme aus verschiedenen Gründen vergleichen, deshalb schreibe ich hier, was ich wollte und wie ich es gemacht habe.

Ich wollte:

  • Um dasselbe Dateisystem mit sich selbst zu vergleichen , dh einen Schnappschuss , nehmen Sie Änderungen vor , machen Sie einen Schnappschuss und vergleichen Sie .
  • Eine Liste, welche Dateien hinzugefügt oder entfernt wurden, kümmerte sich nicht um innere Dateiänderungen.

Was ich getan habe:

Erster Schnappschuss ( before.shSkript):

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

Zweiter Schnappschuss ( after.shSkript):

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

Um sie zu vergleichen ( diff.shSkript):

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

Der gute Teil ist, dass dies so ziemlich Standard-System-Binärdateien verwendet. Wenn der Vergleich anhand des Inhalts erfolgen soll, kann findein -execParameter übergeben werden, der den Dateipfad wiedergibt, und anschließend ein MD5.


8

Wenn Sie keine Lust haben, ein anderes Tool zu installieren ...

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!"

Und ja, es könnte genauso einfach mit find and exec oder find and xargs gemacht werden wie mit find in a for loop. Außerdem können Sie die Ausgabe von diff hübsch erhöhen, so dass Dinge wie "Diese Datei befindet sich auf Host1, aber nicht auf Host2" oder Ähnliches angezeigt werden. An diesem Punkt können Sie jedoch auch einfach die Tools installieren, über die alle anderen sprechen ...


5

Ich habe dirdiff in der Vergangenheit verwendet, um Verzeichnisstrukturen zu vergleichen. Es funktioniert nur auf lokalen Verzeichnissen, so dass Sie sshfsIhre anderen Verzeichnisse -mounten müssen.

Das Gute ist, dass Sie visuell sehen können, ob die Dateien gleich sind oder nicht und welche neuer oder älter ist. Und es unterstützt bis zu 5 Verzeichnisse. Sie können auch Unterschiede sehen und Dateien von einer zur anderen kopieren.


4

Aus der rsync-Manpage:

-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.

Vielleicht hilft das ja.


Danke, aber es löst mein Problem nicht (ich suche nach dem Diff, um die Unterschiede zu erkennen).
Adam Matan

4

diff -rfunktioniert eigentlich ganz gut. Wenn Sie nur wissen möchten, ob sich die Dateien unterscheiden, nicht der tatsächliche Inhalt der Unterschiede, dann tun Sie diesdiff -qr


1
-rbedeutet rekursiv, es wird keine Verbindung zu einem Remote-Host hergestellt!
Michael Hampton

3

Ich würde Meld dafür verwenden.


Meld funktioniert sehr gut, wenn Sie eine GUI-Lösung wünschen.
Drew Noakes

2

Neben den bereits unter Windows erwähnten Tools, die Total Commander oder WinSCP verwenden können, verfügen beide über sehr komfortable Funktionen zum Vergleichen (und Synchronisieren) von Verzeichnissen.


0

Ich wollte eigentlich nichts Neues installieren, deshalb ist meine Lösung etwas grob, aber schnell und effektiv.

Ich wollte vergleichen, dass alle Dateien kopiert wurden und der Dateimodus, der Besitz und der SELinux-Sicherheitskontext unverändert bleiben.

Also bin ich gelaufen:

rsync -aX /orig /copy/

und dann vergleiche wie folgt:

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

Wenn der Inhalt beider Dateien reduziert bleibt, sind sie identisch. Wenn nicht, wird das Diff angezeigt.

Aktualisieren Sie die Parameter von ls, um die zu überprüfenden Attribute widerzuspiegeln. YMMV

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.