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?

Rory
quelle

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.

Kyle Brandt
quelle
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 Ø
2

rsync kann dies nicht von Haus aus tun, aber wenn die Möglichkeit besteht, unisono zu arbeiten , können Sie daraus ein Diff-Format erzeugen.

Philip Reynolds
quelle
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 .

Dan Carley
quelle
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?

womble
quelle
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')
tylerl
quelle
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.

sagi
quelle