cp -r -l in MacOS (rekursive Kopie, die feste Links beibehält)

8378

Ich versuche, eine Verzeichnisstruktur rekursiv zu kopieren und dabei Hardlinks in die Datei zu erhalten. Bei Verwendung von gnu cp würde dies mit dem Flag -l funktionieren. cp würde dann die Verzeichnisstruktur neu erstellen, müsste jedoch nicht den Inhalt jeder Datei kopieren.

Dies ist vorläufig für eine Sicherung. Zuerst möchte ich eine billige (fest verknüpfte) Kopie der vorherigen Sicherung erstellen und dann das Quellverzeichnis über diese Kopie rsync. Grob:

 cp -r -l yesterdays_backup todays_backup rsync -a source_dir todays_backup 

Unglücklicherweise unterstützt cp von OSX nicht das Flag -l. Soweit ich das beurteilen kann, unterstützt cpio kein rekursives Kopieren. Die andere Alternative ist pax, aber das führt dazu, dass die gesamte Verzeichnisstruktur kopiert wird:

 pax -rw backups/yesterdays_backup backups/todays_backup 

transformiert:

 yesterdays_backup | \source_dir (...) 

zu:

 todays_backup | \backups \yesterdays_backup \source_dir(...) 

Es sollte einen einfachen / offensichtlichen Weg geben, dies zu tun, aber ich bin momentan überfordert ... Gibt es Alternativen zu cpio und pax? Ich möchte vermeiden, gnu cp installieren zu müssen.

Ich kenne Timemachine, aber verschlüsselte Verzeichnisse werden nicht inkrementell gesichert.

10
Verwenden Sie find zusammen mit cpio, um das Fehlen rekursiver cpio zu umgehen, wie hier beschrieben: (http://www.mikerubel.org/computers/rsync_snapshots/#Incremental), wirkt jedoch nicht sehr elegant ... vor 15 Jahren 0

5 Antworten auf die Frage

14
Paul Wagland

Es ist leicht genug, cp von MacPorts zu installieren. Wenn Sie jedoch kein portables Skript erstellen möchten oder möchten, haben Sie drei Möglichkeiten:

rsync

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\ backups/todays_backup 

cpio

mkdir backups/todays_backup cd backups/yesterdays_backup find . -print | cpio -p -al ../todays_backup 

pax

mkdir backups/todays_backup cd backups/yesterdays_backup pax -rwl . ../todays_backup 
6

Es ist einfach, das coreutilsPaket von MacPorts zu installieren, das den cpumbenannten GNU- Befehl enthält gcp.

Aber noch besser, neuere Versionen von rsync, einschließlich mindestens der Version von OS X 10.5, unterstützen die Option --link-dest, wodurch der anfängliche cp -al nicht erforderlich ist. Sehen Sie hier . Es ist empfehlenswert, auch die Option -E zu verwenden, um erweiterte Attribute, ACLs usw. zu kopieren.

0
Jonathan Leffler

Obwohl cpiorekursives Kopieren nicht direkt unterstützt wird, können Sie die exakte Liste der Dateien, die Sie kopieren möchten, in die Standardeingabe einspeisen und die Wirkung einer rekursiven Kopie mithilfe von findPiped erzielen cpio. Dies ist direkt analog zur Verwendung von GNU tarmit den Optionen -T -(dh, lesen Sie die Liste der Dateien, die von der Standardeingabe gesichert werden sollen).

0

Ich glaube, was Sie wollen, kann auch mit erreicht werden ditto yesterdays_backup todays_backup. Standardmäßig dittowird eine rekursive Kopie erstellt, die feste Links, ACLs und erweiterte Attribute beibehält.

Das Problem ist, dass die Kopie nicht mehr billig ist, wenn feste Verknüpfungen über Verzeichnisse hinweg erstellt werden sollen. dito kann sie erhalten, wenn sie existieren, aber es kann nicht gesagt werden, dass eine Verknüpfung erstellt wird, anstatt ein Duplikat zu erstellen. Florenz Kley vor 13 Jahren 0
Ich glaube nicht, dass Dito sogar dazu aufgefordert werden kann, die harten Links des Verzeichnisses beizubehalten. Man-Seite sagt, dass es nur harte Links gibt Chris F Carroll vor 7 Jahren 0
0
Florenz Kley

+1 für Pauls Antwort. ditto wäre eine Option, aber nur wenn sie in Verbindung mit find verwendet wird - es behält harte Links, aber nur innerhalb von Verzeichnissen.