Können Zeitstempel beim Kopieren von Dateien unter OS X beibehalten werden?

Ich bin daran interessiert, die Dateien von drei Macs zu kombinieren, indem ich die Dateien von jedem in eine einzelne Ordnerhierarchie meines Designs auf einer externen Festplatte kopiere.

In meiner bisherigen Erfahrung beim Kopieren von Dateien in OSX verlieren die Dateien manchmal ihre Erstellt- und Geändert-Zeitstempel; dh sie werden bis zum gegenwärtigen Moment geändert, wenn die Datei kopiert wird.

Wie kann ich sicherstellen, dass dies nicht passiert?

Wann gehen Zeitstempel verloren?
Kopieren sie wie?

Antworten (6)

Ich bin gerade selbst darauf gestoßen, und der eingebaute cpBefehl handhabt es tatsächlich.

Ich habe einen Haufen alter CF-Karten entdeckt, von denen ich die Bilder ernten wollte. Meine Verarbeitungsskripte sehen sich die Datei mtime an, um sie an der richtigen Stelle abzulegen, also musste ich sie erhalten.

Aus der Manpage :

 -p    Cause cp to preserve the following attributes of each source file in the copy: modification time,
       access time, file flags, file mode, user ID, and group ID, as allowed by permissions.  Access
       Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also be pre-
       served.

       If the user ID and group ID cannot be preserved, no error message is displayed and the exit value
       is not altered.

       If the source file has its set-user-ID bit on and the user ID cannot be preserved, the set-user-
       ID bit is not preserved in the copy's permissions.  If the source file has its set-group-ID bit
       on and the group ID cannot be preserved, the set-group-ID bit is not preserved in the copy's per-
       missions.  If the source file has both its set-user-ID and set-group-ID bits on, and either the
       user ID or group ID cannot be preserved, neither the set-user-ID nor set-group-ID bits are pre-
       served in the copy's permissions.

Also, mit zshkonnte ich laufen ( NO NAMEwobei es sich um den Volumennamen meiner Karte handelt):

cp -rvp /Volumes/NO\ NAME/DCIM/**/*.{JPG,jpg} ~/Desktop/tmp/pics

Ich glaube, dass das spezielle /**/*Konstrukt spezifisch für ZSH ist; Sie könnten jedoch so etwas tun

find /Volumes/WHATEVER -type d -print0 | xargs cp -vp {}/*.JPG /my/out/path
+1 Ein einfaches cp -pist unkompliziert, behält die geänderte Zeit bei (wahrscheinlich der nützlichste der drei Zeitstempel in einer Datei) und erfordert keine Erstellung einer Zwischenarchivdatei.
Soweit ich weiß, vergisst "cp -p" das Erstellungsdatum und setzt es stattdessen auf das Änderungsdatum. Was ein ziemlich absurdes Verhalten ist.
cp -pfunktioniert jedoch nicht beim Kopieren von HFS+ nach FAT32.

Ich verwende rsync , um diese Art von Kopie zu erstellen. Beachten Sie jedoch, dass die von Apple bereitgestellte Version 2.6.9 ist und diesbezüglich Fehler aufweist. Sie müssen sich also einen Drittanbieter bauen lassen, entweder selbst bauen oder über einen Paketmanager

zum Beispiel

rsync -aEAX source_dir target_dir

Die Option -Ekopiert die ACLs und -abehält die Unix-Berechtigungen bei und mal A kopiert die ACLs und X kopiert die xattributes (onm rsyn Version 3. Version 2 hat kein AX)

rsynckann auch so eingerichtet werden, dass es auf Remote-Rechner kopiert werden kann, ohne Laufwerke zu mounten.

Es gibt einige GUI-Frontends für rsync, zB aRsync . Informationen zu anderen Tools zur Verzeichnissynchronisierung finden Sie in dieser Frage .

rsyncist eine gute Lösung, aber beachten Sie, dass die Zugriffszeiten nicht erhalten bleiben. pax(siehe meine Antwort unten) tut.
Soweit ich weiß, vergisst "rsync" das Erstellungsdatum und setzt es stattdessen auf das Änderungsdatum. Was ein großer Fehler ist.
→ jaume: Jeder Befehl, der eine Kopie von "Datei a" in "Datei b" erstellt, muss zuerst "Datei a" lesen. Daher sollte die Zugriffszeit von "Datei a" geändert werden. Dies ist kein Feature auf Befehlsebene, sondern auf Kernel-Ebene. Wenn ein Befehl durch einen anderen Systemaufruf die Zugriffszeit auf ihren vorherigen Zustand zurücksetzt, dann ist dies ein gefährlicher Trick, weil es eine glatte Lüge ist .
→ Nikolaus: vgl. man rsyncund suche nach preserve times:) ⇒ die Antwort von Mark ist richtig.
@daniel - Dieser Artikel sagt etwas anderes: Kopieren Sie? Siehe insbesondere die Tabelle am Ende.
@NicolasBarbulesco - siehe Fehler bugzilla.samba.org/show_bug.cgi?id=6276 , also sollte es in 3.06 und höher sein und das impliziert, dass es früher haben sollte. Ich weiß jedoch nicht, wann rsync ursprünglich dazu geändert wurde - ich vermute, wir nach diesem Magazin im Jahr 2006
→ Mark, @daniel - Ich habe gerade rsync in Mac OS X 10.6.8 getestet. Eine lokale Kopie eines Ordners mit "rsync -rt" vergisst das Erstellungsdatum von Dateien und ersetzt es durch ihr Änderungsdatum. Trotz der Anleitung für "rsync" steht bei der Option "Zeiten beibehalten" -t. Der Fehler ist wahrscheinlich auch in Mavericks und Yosemite vorhanden.
@NicolasBarbulesco welche Version von rsync
Sieht so aus, als hätte Snow Leopard rsync 2.6.9 verwendet, siehe opensource.apple.com/source/rsync/rsync-40 , also ist es alt und sieht so aus, als hätte es keine Fehlerbehebung. Spätere Versionen werden es tun (als ich SL hatte, habe ich ein rsync eines Drittanbieters verwendet aus diesem oder einem ähnlichen Grund)

Verwenden Sie pax. Das Standardformat mit dem paxNamen ustar bewahrt die Dateiänderungs- und Zugriffszeiten (unter anderem wie Benutzer-ID, Gruppen-ID, Dateimodusbits und erweiterte Attribute wie Spotlight-Kommentare und ACLs). Siehe paxManpage hier für weitere Details.

Erstellen paxSie zunächst auf jedem Mac ein Archiv und kopieren Sie es wie folgt auf die externe Festplatte:

  1. Öffnen Sie Anwendungen > Dienstprogramme > Terminal.
  2. Terminal eingeben:

    $ cd
    

    und ziehen Sie den Ordner, in dem sich die zu kombinierenden Dateien auf diesem Mac befinden, in das Terminal:

    Geben Sie hier die Bildbeschreibung ein

    Alternativ können Sie den vollständigen Ordnernamen eingeben:

    $ cd /path/to/your\ folder
    

    Dadurch wird der aktuelle Ordner in „Ihr Ordner“ geändert.

  3. Archivieren Sie den Ordner mit pax:

    $ cd ..
    $ pax -w "your folder" > yourfolder.ustar
    
  4. Verwenden Sie den Finder, um das neu erstellte Archiv yourfolder.ustarauf die externe Festplatte zu kopieren.

Entpacken Sie dann die Archive mit pax:

  1. Öffnen Sie Terminal auf dem Mac, an den die externe USB-Festplatte angeschlossen ist.

  2. Ändern Sie den aktuellen Ordner in die einzelne Ordnerhierarchie auf der externen Festplatte mit dem Befehl cdwie oben beschrieben:

    $ cd /Volumes/externalHDD/path/to/single \folder
    $ ls
    yourfolder.ustar
    yourfolder2.ustar
    yourfolder3.ustar
    
  3. Extrahieren Sie die Archive:

    $ pax -r -p e < yourfolder.ustar
    $ pax -r -p e < yourfolder2.ustar
    $ pax -r -p e < yourfolder3.ustar
    $ ls
    your folder
    your folder 2
    your folder 3
    
  4. Verschieben Sie die Dateien bei Bedarf mit dem Finder (der Finder behält Dateiänderungen und Zugriffszeiten innerhalb desselben Volumes bei).

(Ich habe dieses Verfahren unter OS X 10.8 (Mountain Lion) getestet.)

Funktioniert nicht bei Dateinamen mit mehr als 200 Zeichen community.hpe.com/t5/Ignite-UX/…

Komprimieren Sie sie mit Zip oder wählen Sie sie mit Strg-Klick oder Rechtsklick aus und wählen Sie Komprimieren. Kopieren Sie die komprimierten Dateien auf Ihr Zielsystem und öffnen Sie sie dort.

Wenn Sie können, formatieren Sie Ihr externes Laufwerk als Mac OS-Dateisystem, nicht als FAT.

Nicht Option-Klick. Strg-Klick. Oder klicken Sie mit der rechten Maustaste.
Die beste Wahl zum Formatieren der Festplatte ist Mac OS Extended Journalled. Mac OS Extended wird auch als HFS+ bezeichnet.

Ich habe versucht, was Jaume oben vorgeschlagen hat (danke Jaume!), aber für mich (auf meiner sehr alten Hardware) war das Erstellen von .ustar-Dateien zu zeitaufwändig und mir ging die Geduld aus ... Stunden später.

Also habe ich die Beispiele hier gelesen und ein Beispiel so angepasst:

pax -r -u -w [source directory] [destination directory]

In meinem Fall habe ich das Verzeichnis mit dem Befehl ‚cd‘ gewechselt und überprüft, ob das Terminal mein Quellverzeichnis ‚User‘ mit dem Befehl ‚ls‘ sehen konnte, bevor es ausgeführt wurde:

pax -r -u -w User /Volumes/T7

Das Ergebnis war, dass alle Dateien ihr ursprüngliches Änderungs-/Erstellungsdatum beibehielten – aber Verzeichnisse hatten „heute“ als Änderungsdatum und ursprüngliches Datum für „Erstellungsdatum“.

Das war gut genug für mich!

PS: Ich bin mir nicht sicher, ob Pax in Darwin integriert ist, da ich TigerBrew vor dem Start installiert habe, aber ich habe das alles unter OS X 10.7.5 gemacht.

Kann es Verzeichniszeitstempel für das Erstellungsdatum, das Änderungsdatum und das Zugriffsdatum von Mac OS oder Linux auf Windows 10 beibehalten?