it-swarm.com.de

Rsync: Nur über Zeitstempel kopieren

Derzeit habe ich zwei Verzeichnisse A/und B /, die mit Ausnahme der Zeitstempel in jeder Hinsicht identisch sind. Deshalb, wenn ich den Befehl ausführe:

rsync --dry-run -crvv A/ B/

dann werden alle Dateien als "aktuell" markiert, während der Befehl:

rsync --dry-run -rvv A/ B/

zeigt, dass alle Dateien von A/nach B/kopiert werden sollen.

Meine Frage lautet: Wenn ich weiß, dass die Dateien (in Bezug auf den Inhalt) identisch sind, gibt es eine Möglichkeit (über rsync oder auf andere Weise), die Zeitstempel für Dateien in B/so festzulegen, dass sie mit den Zeitstempeln der Dateien in identisch sind A /, ohne alle Dateien von A/nach B/zu kopieren?

Vielen Dank

44
artella

Wenn Sie -t (Zeitstempel beibehalten) und --size-only Verwenden, werden nur Dateien nach Größe verglichen. Wenn die Größe übereinstimmt, kopiert rsync die Datei nicht, aber da -t Angegeben ist, wird der Zeitstempel in der Zieldatei aktualisiert, ohne ihn erneut zu kopieren.

Stellen Sie sicher, dass Sie nicht -u (Update) verwenden, da dadurch bereits vorhandene Dateien übersprungen werden und die Aktualisierung des Zeitstempels vollständig übersprungen wird.

Ich hatte das Problem, ursprünglich nicht mit rsync eine Reihe von Dateien auf ein neues Laufwerk zu kopieren, und daher wurden die Zeitstempel auf die aktuelle Zeit aktualisiert. Ich habe den folgenden Befehl verwendet, um alles in angemessener Zeit korrekt zu synchronisieren:

rsync -vrt --size-only /src /dest
76
Grant Pannell

Wenn Sie --size-only verwenden, überspringt rsync das Vergleichen von Dateizeitstempeln (und damit des Dateiinhalts), wenn die Größen übereinstimmen. Wenn Sie dies mit --times kombinieren, werden die Zeitstempel in den Zielbaum geklont.

6
user115916

Ich denke, rsync ist das richtige Werkzeug, um dies zu erreichen, aber wenn Sie möchten, dass ein Skript dies tut, kann dies einen guten Start bedeuten.

Sie können eine Dateiliste mit Zeitstempeln (Zugriffszeiten) wie folgt erhalten:

find . -printf '"%p" %a\n' -type f > /tmp/times

Und erhalten Sie die entsprechenden Zeitaktualisierungsbefehle:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Es ist kein vollständiges Skript, aber ein guter Startplatz! :)

3
Stone

Verwenden Sie Quelle (z. B. /path/to/source) Verzeichnis als Referenz für den Touch-Befehl. Einfach cd in Ihr Ziel Verzeichnis und tun

find -type f -exec touch -r /path/to/source/{} {} \;

Sie können mit rsync (noch) keine Zeitstempel im Subsekundenbereich kopieren.

Dies funktioniert auch für Verzeichnisse und Pseudodateien (entfernen oder ändern Sie einfach das -type f)

2
knorke

Nun, Sie könnten sicherlich ein Skript schreiben, das den Zeitstempel von einer Seite liest und ihn dann mit touch auf derselben Datei auf der anderen Seite festlegt.

Aber das würde wahrscheinlich viel länger dauern, als rsync einfach versuchen zu lassen, alle Dateien zu kopieren. Es werden nur sehr wenige Daten übertragen (nur Block-Hashes, wenn die Dateien wirklich identisch sind). Der vollständige Inhalt jeder Datei muss jedoch mindestens auf jeder Seite gelesen werden. Daher ist es durch die Festplattenbandbreite oder IOPS begrenzt. Dies kann eine Weile dauern. Aber wahrscheinlich noch weniger Zeit als ein Skript zu schreiben und zu testen, um es zu tun.

1
rmalayter

Für Leute wie mich, die die Dateien ändern und den ursprünglichen Zeitstempel beibehalten möchten (z. B. aktualisieren Sie die Meta-Tags Ihrer Musikbibliothek).

Es basiert auf der von Stone bereitgestellten Lösung. Hier jedoch über die Änderungszeit und ein funktionierendes Skript zum Wiederherstellen der Zeitstempel. Machen Sie zuerst Schritt eins und beginnen Sie dann mit der Arbeit mit Ihren Dateien.

  1. Alte Zeitstempel beibehalten. Es arbeitet aus dem aktuellen Verzeichnis, schließt alle versteckten Dateien aus und speichert es in der temporären Datei in /tmp/files. Sie können die Parameter jederzeit ändern, bleiben aber besser bei -printf '"%t" "%p"\n' da der spätere Befehl touch dies verwendet.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Ändern Sie Ihre Dateien so viel Sie möchten

  3. erstellen Sie jetzt eine Datei, mit der Sie die Zeitstempel wiederherstellen können:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. Und schließlich wenden Sie die alten Daten auf die geänderten Dateien an

    sh job.sh

Vorsichtsmaßnahme: Funktioniert für Dateien mit Namensabstand, Sonderzeichen, aber zum Beispiel keine Dateien mit einem $ melde dich an.

0
Burcardo

Beste Möglichkeit, nur Zeitstempel unter Windows zu kopieren:

Um den zuletzt erstellten/geänderten/aufgerufenen Zeitstempel einer Datei in einen anderen zu kopieren, können Sie Folgendes verwenden:

touch/c/m/a/r SourceFile DestFile

(Diese Version von Touch ist Teil der Win32 Console ToolBox http://www.stevemiller.net/apps/ )

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY"/E/COPYALL/DCOPY: DAT/XF ./R: 10/W: 5/V/ETA

0
Pierre

Das rsync-Handbuch: man rsync listet ein -t und -N wechseln, sie könnten es wert sein, damit herumzuspielen.

0
Tim