Soll rsync eine Patch-Datei generieren, anstatt zwischen Dateien zu kopieren?


19

Ich kopiere viele Dateien, die sich mit rsync von einem Server auf einen anderen geändert haben. Ich weiß, dass ich die -nOption für einen Probelauf verwenden kann, damit ich sehen kann, welche Dateien geändert wurden. Ist es jedoch möglich, rsync zu veranlassen, einen Unterschied des Dateiinhalts zu drucken, der geändert wurde? Ich möchte sehen, was passiert, bevor ich eine Kopie mache. Kann ich etwas in eine Datei speichern und das später mit diff (1) anwenden?

Antworten:


8

Es könnte einen besseren Weg geben, aber dies könnte funktionieren, wenn auch nicht so effizient:

 rsync -vrn / dest:/ > ~/file_list

Dann editiere test um die Statistiken zu entfernen, dann:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Eine andere Option:
Sie könnten auch in Betracht ziehen, das Dateisystem mit etwas wie sshfs / fuse zu mounten und dann einfach diff zu verwenden.


Hinweis: Ich habe diese Befehle nicht getestet ;-)
Kyle Brandt

Guter Start, aber es gibt jede Menge zusätzliche Ausgaben von rsync, wie z. B. die Statistik und "Senden einer inkrementellen Dateiliste" usw.
Rory

Sie könnten --out-format = "% f" verwenden
Kyle Brandt

Wenn Sie das Out-Format verwenden, löschen Sie das v und grep -v 'Nicht-reguläre Datei überspringen' ... Das sollte es ziemlich sauber machen
Kyle Brandt

Überprüfen Sie einfach, ob es rsync --diffzwei Jahre später eine neue / bessere Methode gibt ...
Ring Ø



1

Dies ist nativ nicht möglich, da rsync nur binäre Unterschiede zwischen Dateien berücksichtigt.

Möglicherweise können Sie es mithilfe der Ausgabe von rsync skripten. Aber es wäre hackisch.

Ich glaube, dass es mit Unison von Haus aus möglich ist .


1
Ist meins, was du mit hackisch gemeint hast? :-)
Kyle Brandt

Auf
jeden

1

Warum nicht einfach so etwas wie diff (für Textdateien) oder xdelta (für Binärdateien) verwenden, um die Diffs zu generieren? Warum müssen Sie speziell etwas aus rsync herausholen?


Ich brauche kein rsync, aber es muss fern sein
Rory

Oh nein, ssh!
womble

1

Um die Antwort von Kyle zu erweitern, automatisiert dies den Prozess. Beachten Sie, dass es völlig ungetestet ist, wahrscheinlich ziemlich zerbrechlich und Ihren Computer löschen und Ihren Hund töten kann.

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')

0

Der rsync-Algorithmus vergleicht die Binärblöcke der Datei. Ein solches binäres Diff soll nicht druckbar sein. Es gibt einen Befehl namens rdiff , der den rsync-Algorithmus verwendet, um ein binäres Diff zu generieren, aber ich glaube nicht, dass er für das, was Sie beschreiben, nützlich ist. Er wird häufig zum Implementieren inkrementeller Sicherungen verwendet.

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.