c't 9/2018
S. 150
Praxis
Besser kopieren am Mac

Copy right!

Schneller, eleganter und sicherer kopieren auf dem Mac

Der Finder ist zwar der bequemste Weg, Ordner oder Dateien unter macOS zu kopieren – aber selten der beste. Wer keine Scheu vor Terminal-Befehlen hat, bringt seine Daten nicht nur viel schneller, sondern auch sicherer ans Ziel.

Hier angepackt, dort losgelassen, so kopieren die meisten per Drag & Drop in macOS. Alternativ kommen die Daten per Cmd+C und Cmd+V ans Ziel. Doch der Finder, über den die Reise geht, agiert oft lahm und nicht selten dumm. So kommt es vor, dass er Erstellungs- und Bearbeitungszeit von Dateien vergisst oder durch das Kopierdatum ersetzt – blöd, wenn bei der digitalen Dia-Show vom letzten Urlaub die Bilder wild durch den Zeitstrahl springen.

Glücklicherweise bringen einen diverse in macOS integrierte Terminal-Befehle schneller und zuverlässiger ans Ziel, egal ob lokal oder im Netz. Je nach Einsatzzweck und Aufgabe sind cp, ditto oder rsync die schlauere Wahl. Berührungsängste sind unbegründet – wer Sinn und Syntax der Befehle durchschaut hat, spart Zeit.

Tabelle
Tabelle: Kopieren am Mac: Performance-Vergleich

An einem aktuellen Retina-iMac 5K ermittelten wir für jeden der Befehle, wie lange es dauerte, einen 7 GByte großen Ordner voller MP3-Dateien oder ein 550 MByte großes Verzeichnis mit den Quellen für den Linux-Kernel zu kopieren (siehe Tabelle). Gerade dessen zahlreiche Winz-Dateien sind die Nagelprobe für Kopierroutinen. Als lokales Ziel diente eine per Thunderbolt 3 angebundene NVMe-SSD vom Typ Corsair Neutron NX500. Im Gigabit-Netzwerk schickten wir die Daten an einen Mac mini (Modelljahr 2014) mit SSD, der direkt per CAT5e-Kabel mit dem iMac verbunden war.

Vorweg noch zwei Tipps für Kommandozeilen-Muffel: Wer nicht den vollen Pfad eintippen mag, kann mit dem Tabulator nach den ersten paar Buchstaben den Rest eines Wortes ergänzen. So wird beispielsweise /Vo+Tab zu /Volumes/. Noch bequemer ist es, nur den Befehl einzutippen und Quelle und Ziel einfach aus dem Finder ins Terminal-Fenster zu ziehen.

Lokaler Austausch

Mit cp kopiert man Dateien und Ordner am selben Rechner von A nach B. Bei unserem MP3-Test war die Zeitersparnis gegenüber dem Finder nur minimal, aber für die Kernel-Quellen brauchte cp nur halb so lange.

Im einfachsten Fall lautet das Kommando

cp /Quelle /Zielordner

wobei die Quelle eine Datei oder ein Pfad sein kann.

Optionen, auch Schalter genannt, präzisieren den Befehl weiter oder aktivieren zusätzliche Möglichkeiten. Wie bei allen Terminal-Kommandos zeigt man gefolgt vom jeweiligen Befehl sämtliche Optionen. Man gibt sie einzeln oder zusammengefasst hinter dem Minuszeichen ein; manche muss man hinter einem doppelten Minuszeichen als Wort ausschreiben. Praktisch immer hilfreich ist beispielsweise v („verbose“, Englisch für „geschwätzig“), das das Tool Statusinformationen ausspucken lässt.

Ergo kopiert

cp -v /Users/ctuser/:

.Urlaubsbilder/Eiffelturm.jpg:

. /Volumes/Datengrab/Bilderbackup/

das Bild vom Pariser Wahrzeichen auf das externe Laufwerk „Datengrab“ in den Unterordner „Bilderbackup“. Da cp den Ordner dabei nicht anlegt, muss dieser bereits existieren, sonst gibt es eine Fehlermeldung. Der Befehl

cp -vpR /Users/ctuser/Urlaubsbilder:

. /Volumes/Datengrab/

kopiert das gesamte Verzeichnis „Urlaubsbilder“ und erzeugt ihn bei Bedarf am Ziel; R (für „rekursiv“) ist bei Ordnern Pflicht und kopiert alle Unterordner mit. Kleine syntaktische Gemeinheit: Endet die Pfadangabe der Quelle mit Schrägstrich, wird nicht das Verzeichnis, sondern nur dessen Inhalt ans angegebene Ziel kopiert. p sorgt dafür, dass diverse Dateiattribute wie Berechtigungen, Änderungsdatum und letzter Zugriff erhalten bleiben.

Der Befehl, um ein Verzeichnis zu verschieben, lautet mv, die weitere Syntax ist zu der von cp identisch.

ditto arbeitet lokal ähnlich schnell wie cp, kopiert aber Verzeichnishierarchien und führt sie gegebenenfalls zusammen.

ditto /Users/ctuser/Urlaubsbilder/:

. /Volumes/Datengrab/Bilderbackup/

kopiert den Inhalt von „Urlaubsbilder“ in das Verzeichnis „Bilderbackup“ auf dem Datengrab. Gibt es diesen Ordner dort bereits, fügt der Befehl dem Ziel alles aus der Quelle hinzu. Doch Vorsicht: Dabei werden bestehende Dateien mit gleichem Namen im Ziel überschrieben.

Mit dem Schalter c packt ditto das Quellverzeichnis in ein .cpio-Archiv. z komprimiert dieses per gzip, j nutzt stattdessen bzip2, das besser packt, aber auch mehr CPU-Zeit fordert. In beiden Fällen lautet die richtige Dateiendung .cpgz. Aus Kompatibilitätsgründen mit älterer Software ist k interessant, mit der man ein PKZip-Archiv mit der Dateiendung .zip erstellt. So entsteht mit

ditto -cj /Users/ctuser/Urlaubsbilder:

. /Volumes/Datengrab/Bilderbackup/:

.Paris.cpgz

das Archiv Paris.cpgz. Dieses extrahiert man mit dem Schalter x an einen beliebigen Zielpfad:

ditto -x:

. /Volumes/Datengrab/Paris.cpgz:

. /Volumes/USB-Stick/

Netzschieberei

Deutlich mächtiger und flexibler als die bisher vorgestellten Kommandos ist rsync, ein Tool zum Datenabgleich mit lokalen Laufwerken und Netzfreigaben. Es kann sich zudem mit rsync-Servern verbinden, die nicht nur auf vielen Linux-Servern laufen, sondern auch auf dem heimischen NAS. Es lässt sich aber auch zum einfachen Kopieren einsetzen.

So wandert mit dem Befehl

rsync -uva:

. /Users/ctuser/Urlaubsbilder:

. /Volumes/Datengrab/Bilderbackup

eine Kopie des Ordners „Urlaubsbilder“ an den angegebenen Ort. Der Clou: Mit dem Schalter u (für „update“) kopiert rsync nur neue Dateien und solche, deren Änderungsdatum neuer ist als das der Datei am Ziel – das spart Zeit. a (für „archive“) bündelt mehrere Optionen, sodass rsync unter anderem Unterverzeichnisse und deren Inhalt mitnimmt und Berechtigungen sowie Erstellungs- und Änderungsdatum erhält. Wie bei cp muss man auch bei rsync beim Quellpfad darauf achten, dass er ohne Schrägstrich endet – andernfalls wird nur der Verzeichnisinhalt kopiert.

Führt man den rsync-Befehl das erste Mal aus, nimmt man den entfernten Rechner in die Liste der bekannten Rechner auf.

Im Netzwerk zwischen den beiden Test-Macs war rsync der Copy-King: Für die Kernel-Sourcen brauchte cp knapp 1300 Sekunden, der Finder immer noch beinahe 900. rsync erledigte es in 30. Offenbar bremst das SMB-Protokoll, über das wir den entfernten Ordner als lokal eingebundenes Laufwerk bereitstellten.

Auf dem Mac setzt rsync hingegen auf SSH als Übertragungsweg. Voraussetzung: Der SSH-Dienst muss auf dem Zielrechner laufen, was man am Mac schnell über die Systemeinstellungen unter „Freigaben/Entfernte Anmeldung“ erledigt. Wenn man den rsync-Befehl das erste Mal ausführt, fragt das Tool, ob man dem bislang unbekannten entfernten Rechner vertrauen will, was man mit „yes“ bestätigt. Anschließend gibt man das Passwort des Nutzerkontos ein, mit dem man sich dort anmelden will, dann beginnt die Datenübertragung.

Ist in den Systemeinstellungen unter „Freigaben“ die „Entfernte Anmeldung“ aktiviert, stehen SSH und rsync zur Verfügung.

Die Syntax ist bei Netzlaufwerken im Prinzip identisch wie beim lokalen Kopieren, der Zielpfad beginnt allerdings mit den vorangestellten Anmeldedaten im Format Nutzer@IP-Adresse:/Zielpfad für den entfernten Rechner.

Die Bildersammlung sichert also

rsync -uva:

. /Users/ctuser/Urlaubsbilder:

. ctuser@192.168.24.33::

./Volumes/Netzspeicher/

ins Netzwerkverzeichnis „Netzspeicher“ auf dem Rechner mit der angegebenen IP-Adresse unter Verwendung der Anmeldedaten des Nutzers „ctuser“. Will man vom entfernten Rechner auf den lokalen syncen, tauscht man die Reihenfolge der beiden aus.

Die Option --delete schafft Ordnung, ist allerdings mit Vorsicht zu verwenden: Sie löscht im Ziel alle Dateien, die in der Quelle nicht existieren. Wehe, man vertauscht Quelle und Ziel.

Zwei Optionen machen das Leben bei schmalbandigen, wackligen Verbindungen leichter: Bricht während der Übertragung die Leitung weg, startet man den nächsten Durchlauf zusätzlich mit der Option --append, die unterbrochene Dateitransfers wieder aufnimmt, statt von vorn zu beginnen. z komprimiert die Daten vor dem Senden und kann so die Übertragungszeit verkürzen. (bkr@ct.de)