Beste Möglichkeit zum Vergleichen (Diff) einer vollständigen Verzeichnisstruktur?

Beste Möglichkeit zum Vergleichen (Diff) einer vollständigen Verzeichnisstruktur?

Wie lassen sich Verzeichnisstrukturen am besten vergleichen?

Ich habe ein Backup-Dienstprogramm, das verwendetrsync. Ich möchte die genauen Unterschiede (hinsichtlich Dateigröße und Datum der letzten Änderung) zwischen der Quelle und dem Backup angeben.

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 fertig sein oder eine Idee für ein Python-Skript sein.

Vielen Dank!

Udi

Antwort1

Das Werkzeug, das Sie suchen, istrdiff. Es funktioniert wie die Kombination von rsync und diff. Es erstellt eine Patch-Datei, die Sie vergleichen oder verteilen können.

Antwort2

Manche Leute möchten Dateisysteme aus verschiedenen Gründen vergleichen, deshalb schreibe ich hier, was ich wollte und wie ich es gemacht habe.

Ich wollte:

  • Zum Vergleichen dergleiches Dateisystemmit sich selbst, d.h.Schnappschuss,Änderungen vornehmen,Schnappschuss,vergleichen.
  • Eine Liste der hinzugefügten oder entfernten Dateien, ohne Berücksichtigung interner 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

So vergleichen Sie sie ( diff.shSkript):

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

Das Gute daran ist, dass hier so ziemlich alle Standard-Systembinärdateien verwendet werden. Ein Vergleich auf der Grundlage des Inhalts könnte durch die Übergabe findeines -execParameters erfolgen, der den Dateipfad und danach einen MD5 wiedergibt.

Antwort3

wenn Sie keine Lust haben, ein weiteres 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 mit find und exec oder find und xargs genauso einfach gemacht werden wie mit find in einer for-Schleife. Außerdem können Sie die Ausgabe von diff aufhübschen, sodass sie Dinge wie „diese Datei ist auf Host1, aber nicht auf Host2“ oder so etwas sagt, aber an diesem Punkt können Sie genauso gut die Tools installieren, von denen alle anderen reden …

Antwort4

diff -rfunktioniert eigentlich ganz gut. Wenn Sie nur wissen möchten, ob sich die Dateien unterscheiden, nicht den tatsächlichen Inhalt der Unterschiede, danndiff -qr

verwandte Informationen