rsync und mod-time

Dinh

Well-Known Member
Hallo zusammen

Ich habe hier ein kleines Problemchen mit rsync und obwohl das ganze auf einem Linux-Server läuft, denke ich, werde ich hier die kompetentesten Antworten erhalten - rsync gibt es ja auch unter *BSD. :)

Folgendes Szenario:
Ich habe die alten Backupdaten Daten-B nach Daten-A kopiert. Leider gingen alle mod-time Attribute verloren und alle Timestamps von Daten-A sind jetzt auf das Datum des cp-Befehls gesetzt. :)
Daraufhin wurde mit Daten-A weitergearbeitet und erst ein paar Tage später fiel mir mein Missgeschick auf.

Problem:
Wie kann ich alle Timestamps der Dateien von Daten-B in Daten-A übernehmen, aber ohne dass die Änderungen verloren gehen?

Lösungsansatz:
Vielleicht kann ich mit rsync zuerst eine Kopie (Daten-Temp) von Daten-B erstellen, dann mit rsync alle geänderten Dateien in Daten-A nach Daten-Temp syncen - wobei hier wirklich nur die tatsächlich geänderten Dateien angefasst werden dürften!! - und wenn alles gut aussieht, Daten-Temp nach Daten-A syncen.
Nur wie mach ich das? :ugly:
Code:
rsync -a datenB/ temp
rsync -ca --delete datenA/ temp
rsync -a temp/ datenA
Gibt es vielleicht einen einfacheren Weg? :)

Die Frage ist hier vor Allem, welche der rsync-Optionen die richtige ist: -c oder irgend eine --ignore-Times-Option?

Ich hoffe, jemand kann mir auf die Sprünge helfen. :)

-- Dinh --
 
Ich glaube, ich habe eine Lösung:
Code:
# daten  = aktuelle Daten mit falschem Zeitstempel
# backup = alte Daten, dafür mit richtigem Zeitstempel
rsync -a backup/ temp
rsync -crv --delete daten/ temp
rsync -a temp/ daten
Könnte das jemand überprüfen? Wichtig ist vor allem, dass vor und nach den Befehlen im Ordner daten die selben Dateien mit dem selben Inhalt sein dürfen. Nur die Attribute dürfen ändern!

-- Dinh --

EDIT: weiss jemand, wie viel länger das mit -c dauert? Es handelt sich um > 60GB und mehrere 100'000 Dateien. :)
 
Zuletzt bearbeitet:
Du kannst keine allgemeine Loesung dafuer finden, denn woher soll er wissen, welchen Timestamps er trauen kann? Ich wuerde folgenden Ansatz verfolgen

mit find(1) und stat(1) die mtime der alten Dateien extrahieren. Mit find(1) und stat(1) die mtime der neuen Dateien extrahieren. Dat ganze mit join(1) auf die Form "alt neu pfad" bringen.

Nun hast du eine ganze Latte von Timestamps in Spalte 2, welche zwischen X und X+t liegen (die Dauer deines urspruenglichen cp(1)). Die kannst du bequem mit awk(1) rausfiltern und schliesslich ein touch(1) -t alt pfad pro Zeile laufen lassen.

Du solltest die Timestamps ueber stat(1) gleich in %y%m%d%H%M%S ausgeben, weil touch(1) das so will.

Falls du da noch Hilfe brauchst, das ist schnell realisiert, sowas.
 
Danke für deine Antwort. Das klingt für mich aber unendlich kompliziet und fehleranfällig! :eek:

Warum nicht einfach so, wie in meinem zweiten Post beschrieben? Im Backup stimmen ja die Timestamps.
Code:
rsync -a backup/ temp
erstellt mir eine komplette Kopie des Backups - sogesehen als working dir.

Jetzt muss ich nur noch irgendwie alle stattgefundenen Änderungen von meinen Daten aufs Backup übertragen - wobei rsync nicht auf die Zeiten schauen darf. Gelöschte Dateien sollen auch gelöscht werden etc:
Code:
rsync -crv --delete daten/ temp
Der c-Parameter sollte jede Datei mittels Hash vergleichen und wirklich nur die Dateien neu syncen, bei denen entweder die Grösse oder der Hash nicht übereinstimmt. Diese geänderten Dateien haben dann zwar den Timestamp dieses Befehls, aber da es nur ein paar Tage sind, ist das vernachlässbar. Unterdessen gelöschte Dateien werden ebenfalls gelöscht.

Theoretisch sollte das temp-Verzeichnis dann genau eine Kopie des Data-Verzeichnis sein, ausser dass alle Dateien, die in Data und Backup identisch sind, die Timestamps von Backup kriegen.
Meine Unix-Kentnisse sind aber noch nicht so fundiert und ich hab Angst, die Daten zu zerstören...

-- DInh --
 
Danke für deine Antwort. Das klingt für mich aber unendlich kompliziet und fehleranfällig! :eek:
Im Gegenteil, du kannst genau sehen, welche Timestamps auf welches Datum angepasst werden wuerden, bei rsync hast du ne Blackbox und musst vertrauen, dass alles gut geht.
Warum nicht einfach so, wie in meinem zweiten Post beschrieben? Im Backup stimmen ja die Timestamps.
...
Theoretisch sollte das temp-Verzeichnis dann genau eine Kopie des Data-Verzeichnis sein, ausser dass alle Dateien, die in Data und Backup identisch sind, die Timestamps von Backup kriegen.
Meine Unix-Kentnisse sind aber noch nicht so fundiert und ich hab Angst, die Daten zu zerstören...
Warum? in /temp kannst du dich doch nach belieben austoben. Ausserdem hat rsync den -n Parameter und -vv kannst du ja ebenfalls noch mit angeben.

Dann hast du zwar wieder "falsche" Timestamps, wenn du nicht auch -t angibst. Aber ob das mit -c genau das tut was du brauchst, das musst du in ner Sandbox testen.
 
Warum? in /temp kannst du dich doch nach belieben austoben. Ausserdem hat rsync den -n Parameter und -vv kannst du ja ebenfalls noch mit angeben.
Ja, nur sollten die Daten ja dann so schnell wie möglich wieder verfügbar sein. Während der "Bastlerei" kann ja nicht gearbeitet werden, darum möchte ich das möglichst als Script vorbereiten und dann über Nacht durcharbeiten lassen.

Dann hast du zwar wieder "falsche" Timestamps, wenn du nicht auch -t angibst. Aber ob das mit -c genau das tut was du brauchst, das musst du in ner Sandbox testen.
Ja, das stimmt, aber nur die paar Hundert Dateien, die geändert wurden. Und die Timestamps wären nur um zwei, drei Tage falsch.
Als ich das mit ein paar Daten testete, hab ich festgestellt, dass -t dazu führt, dass dann doch wieder die Timestamps übernommen werden. Auch bei den nicht übertragenen Dateien.

Ich werd' jetzt mal ein paar ausführliche Test mit einem Teil der Daten machen. Danke soweit. :)
 
Zurück
Oben