Derzeit habe ich zwei Verzeichnisse A / und B /, die bis auf die Zeitstempel in jeder Hinsicht identisch sind. Daher, wenn ich den Befehl ausführen:
rsync --dry-run -crvv A/ B/
dann sind alle Dateien mit "uptodate" markiert, während der Befehl:
rsync --dry-run -rvv A/ B/
zeigt an, 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 dann 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
rsync
copy
synchronization
timestamp
artella
quelle
quelle
Antworten:
Wenn Sie
-t
(Zeitstempel beibehalten) verwenden,--size-only
werden die Dateien nur nach Größe verglichen. Wenn die Größe übereinstimmt, kopiert rsync die Datei nicht. Da-t
jedoch angegeben ist, wird der Zeitstempel in der Zieldatei aktualisiert, ohne sie erneut zu kopieren.Stellen Sie sicher, dass Sie
-u
(update) nicht verwenden, da hierdurch bereits vorhandene Dateien und die Aktualisierung des Zeitstempels vollständig übersprungen werden.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:
quelle
--existing
, um versehentliche Kopien neuer Dateien zu verhindern.--archive
(oder-a
) umfasst-r
,-t
und mehr :)Die Verwendung von --size-only führt dazu, dass rsync den Vergleich von Dateizeitstempeln (und damit des Dateiinhalts) überspringt, wenn die Größen übereinstimmen. Wenn Sie dies mit --times kombinieren, werden die Zeitstempel in den Zielbaum geklont.
quelle
Ich denke, rsync ist das richtige Werkzeug, um dies zu tun, aber wenn Sie ein Skript benötigen, um dies zu tun, kann dies einen guten Anfang geben.
Sie können eine Dateiliste mit Zeitstempeln (Zugriffszeiten) wie folgt erhalten:
Und holen Sie sich die entsprechenden Zeitaktualisierungsbefehle:
Es ist kein vollständiges Skript, aber ein guter Startpunkt! :)
quelle
Verwenden Sie das Quellverzeichnis (z. B.
/path/to/source
) als Referenz für den Touch-Befehl. Einfachcd
in dein Zielverzeichnis und fertigMit rsync können (noch) keine Zeitstempel unter einer Sekunde kopiert werden.
Dies funktioniert auch für Verzeichnisse und Pseudodateien (einfach entfernen oder ändern
-type f
)quelle
touch -ar
aber das ändert immer noch nichts an der Uhrzeit. Ich nehme an, das ist selten erwünscht.Nun, Sie könnten sicherlich ein Skript schreiben, das den Zeitstempel von einer Seite liest und ihn dann mit touch auf dieselbe Datei auf der anderen Seite legt.
Aber das würde wahrscheinlich viel länger dauern, als rsync einfach versuchen zu lassen, alle Dateien zu kopieren. Tatsächlich 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. Sie sind also aufgrund der Festplattenbandbreite oder des IOPS begrenzt, was eine Weile dauern kann. Aber immer noch wahrscheinlich weniger Zeit als das Schreiben und Testen eines Skripts, um es zu tun.
quelle
Für Leute wie mich, die beabsichtigen, die Dateien zu ändern und den ursprünglichen Zeitstempel beizubehalten (z. B. Sie aktualisieren die Meta-Tags Ihrer Musikbibliothek).
Es basiert auf der Lösung von Stone. Allerdings hier über die Änderungszeit und ein funktionierendes Skript zur Wiederherstellung der Zeitstempel. ZUERST mache Schritt eins und beginne dann mit deinen Dateien zu arbeiten.
Alte Zeitstempel beibehalten . Es wird aus dem aktuellen Verzeichnis ausgeführt, schließt alle versteckten Dateien aus und speichert sie in der temporären Datei in
/tmp/files
. Sie können die Parameter jederzeit ändern, aber bleiben Sie besser dabei,-printf '"%t" "%p"\n'
da der späteretouch
Befehl dies nutzt.find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
Ändern Sie Ihre Dateien nach Belieben
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
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
$
Zeichen.quelle
read -r line
. Nun, immer verwendenread
mit-r
. Außerdem können Sie das Öffnenjob.sh
für jede Datei vermeiden .while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
So kopieren Sie nur den Zeitstempel unter Windows:
(Diese Version von Touch ist Teil der Win32 Console ToolBox http://www.stevemiller.net/apps/ )
quelle
Das rsync-Handbuch:
man rsync
listet a-t
und-N
switch auf, mit denen es sich möglicherweise zu experimentieren lohnt.quelle
-N
. Warum empfehlen Sie diese überhaupt?