Frage Rsync: nur Kopieren über Zeitstempel


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

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

dann sind alle Dateien mit "update" gekennzeichnet, während der Befehl:

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

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

Meine Frage ist: Da ich weiß, dass die Dateien identisch sind (in Bezug auf den Inhalt), gibt es eine Möglichkeit (über Rsync oder anders), die Zeitstempel für Dateien in B identisch mit den Zeitstempeln der Dateien in zu sein A /, ohne alle Dateien von A / nach B / zu kopieren?

Vielen Dank


36
2017-12-28 16:35


Ursprung


Wenn Sie wissen, dass die Dateien identisch sind, warum müssen Sie dann alles tun, um sie nicht zu kopieren, um den gewünschten Datums- / Zeitstempel zu erhalten? - Tim
@Tim: Vielleicht gibt es eine Menge von Dateien. - Richard


Antworten:


Verwenden -t (Zeitstempel erhalten) und --size-only wird nur Dateien nach Größe vergleichen. Wenn die Größe übereinstimmt, wird rsync die Datei aber nicht kopieren -t angegeben ist, aktualisiert es den Zeitstempel der Zieldatei, ohne sie erneut zu kopieren.

Stellen Sie sicher, nicht zu verwenden -u (update), da dadurch bereits existierende Dateien übersprungen werden und die Aktualisierung des Zeitstempels komplett übersprungen wird.

Ich hatte das Problem, rsync ursprünglich nicht zu verwenden, um ein Bündel von Dateien auf ein neues Laufwerk zu kopieren, und deshalb 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

64
2017-11-21 13:43



Ich schlage auch vor, hinzuzufügen --existing um versehentliche Kopien neuer Dateien zu verhindern. - leden
Die Flagge --archive (oder -a) beinhaltet -r, -t und mehr :) - Dor


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


6
2018-03-30 13:58





Ich denke, rsync ist das richtige Werkzeug, um dies zu machen, aber wenn Sie wollen, dass ein Skript dies tut, dann kann das einen guten Start geben.

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

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

Und erhalten Sie die entsprechende Zeit Update-Befehle von ihm:

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

Es ist kein komplettes Skript, aber ein guter Startplatz! :)


3
2017-12-28 17:05



Vielen Dank. Ich denke, ich werde wahrscheinlich für den Moment bei Rsync bleiben, aber ich werde definitiv ins Internet gehen und die verschiedenen Komponenten Ihres Skripts lernen, wie es in der Zukunft nützlich sein könnte. - artella
Das schien genau meine Lösung zu sein! Ich möchte die Zeiten beibehalten, während ich einige Metadaten zu meiner Musikbibliothek hinzufüge. Es kann jedoch anscheinend nicht mit Leerzeichen in Dateinamen umgehen): - Burcardo


Benutze die Quelle (z.B. /path/to/source) Verzeichnis als Referenz für den Touch-Befehl. Gerade cd zu deinem Ziel Verzeichnis und tun

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

Mit rsync (noch) können keine Zeitstempel in Sekundenbruchteilen kopiert werden.

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


2
2017-09-29 14:36



Dies war nützlich für mich, da ich zeitweise kopiert werden musste. Ich habe bemerkt, dass es nicht ctime kopiert, was in meinem Fall in Ordnung war. - snapfractalpop
Lesen Sie einfach die Hilfeseite von 'touch'. Sie können atime und mtime mit diesem Befehl einstellen. - knorke
Ja, ich weiß, du kannst es benutzen touch -ar aber das ändert immer noch nicht die ctime. Ich nehme an, das ist selten erwünscht. - snapfractalpop
Ah, ich sehe das Problem jetzt. Vielen Dank. Ja, ctime ist schwer zu ändern und ich weiß nicht warum. - knorke


Nun, Sie könnten sicherlich ein Skript schreiben, das den Zeitstempel von einer Seite liest und dann die Berührung verwendet, um dieselbe Datei auf der anderen Seite zu setzen.

Aber das würde wahrscheinlich viel länger dauern, als einfach rsync versuchen zu lassen, alle Dateien zu kopieren. Sehr wenige Daten werden tatsächlich übertragen (nur Block-Hashes, wenn die Dateien wirklich identisch sind). Aber der volle Inhalt jeder Datei muss mindestens auf jeder Seite gelesen werden. Da Sie von der Bandbreitenkapazität oder IOPS der Festplatte eingeschränkt sind, kann es eine Weile dauern. Aber immer noch wahrscheinlich weniger Zeit als ein Skript zu schreiben und zu testen.


1
2017-12-28 16:53



Danke, mir war dieses Feature von rsync nicht bekannt (es wird auch in Wikipedia diskutiert). - artella


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


0
2017-12-28 16:57





Für Leute wie mich, die es vorhaben Ändern Sie die Dateien, und behalten Sie den ursprünglichen Zeitstempel bei (Sie aktualisieren beispielsweise die Meta-Tags Ihrer Musikbibliothek).

Es basiert auf der von Stone bereitgestellten Lösung. Hier jedoch über die Änderungszeit und ein funktionierendes Skript zur Wiederherstellung der Zeitstempel. FIRST Schritt 1, dann beginnen Sie mit Ihren Dateien zu arbeiten.

  1. Alte Zeitstempel beibehalten. Es arbeitet mit 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 immer ändern, aber bleiben Sie besser bei -printf '"%t" "%p"\n' seit dem späteren touch Befehl nutzt das.

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

  2. Ändern Sie Ihre Dateien so viel wie du willst

  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

Vorbehalt: funktioniert für Dateien mit Namensabständen, Sonderzeichen, aber zum Beispiel keine Dateien mit a $ Melden Sie sich an.


0
2017-07-22 08:19



Um (einige) Probleme mit Backslashes in Ihren Dateinamen zu vermeiden, verwenden Sie read -r line. Gut, immer benutzen read mit -r. Außerdem können Sie das Öffnen vermeiden job.shfür jede Datei. Setzen Sie einfach die Umleitung am Ende des Befehls: while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh - hagello
2. Vorbehalt: Dieses Skript überträgt die Zeitstempel der Verzeichnisse nicht. (Nun, das OP hat nicht danach gefragt.) - hagello


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

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

berühre / c / m / a / r Quelldatei DestFile 

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

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


0
2018-02-08 10:54