cp -r -l in MacOS (rekursive Kopie unter Beibehaltung von Hardlinks)

12

Ich versuche, einen Verzeichnisbaum zu rekursiv zu kopieren, wobei Hardlinks in die Datei beibehalten werden. Bei Verwendung von gnu cp würde dies mit dem Flag -l funktionieren. cp würde dann die Verzeichnisstruktur neu erstellen, müsste aber 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 neu synchronisieren. Grob:

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

Leider unterstützt cp von OSX das Flag -l nicht, 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 derzeit ratlos ... Gibt es Alternativen zu cpio und pax? Ich möchte vermeiden, gnu cp installieren zu müssen.

Timemachine ist mir bekannt, aber dadurch werden verschlüsselte Verzeichnisse nicht ordnungsgemäß inkrementell gesichert.


quelle
Mit find zusammen mit cpio umgehen Sie den Mangel an rekursivem cpio wie hier beschrieben: ( mikerubel.org/computers/rsync_snapshots/#Incremental ), scheint aber nicht sehr elegant zu sein ...

Antworten:

16

Es ist einfach genug, cp von MacPorts zu installieren. Wenn Sie jedoch kein portables Skript erstellen möchten oder haben, 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
Paul Wagland
quelle
Was ist, wenn sich Quelle und Ziel auf verschiedenen Festplatten befinden? Würde rsync in der am Ziel erstellten Kopie weiterhin feste Links von der Quelle beibehalten?
lpacheco
7

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

Noch besser ist jedoch, dass neuere Versionen von rsync, einschließlich der Version in OS X 10.5, die Option --link-dest unterstützen, wodurch die Notwendigkeit des anfänglichen cp-al entfallen sollte. Siehe hier . Es wird empfohlen, auch die Option -E zu verwenden, um erweiterte Attribute, ACLs usw. zu kopieren.


quelle
1

Obwohl cpiorekursives Kopieren nicht direkt unterstützt wird, können Sie die genaue Liste der Dateien, die Sie kopieren möchten, in die Standardeingabe einspeisen und den Effekt einer rekursiven Kopie mithilfe von findPiped In 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).

Jonathan Leffler
quelle
1

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


quelle
Das Problem ist, dass die Kopie nicht mehr billig ist, wenn das Ziel darin besteht, feste Links über den gesamten Verzeichnisbereich hinweg zu erstellen. dito kann sie beibehalten, wenn sie existieren, aber es kann nicht angewiesen werden, sie zu verknüpfen, anstatt ein Duplikat zu erstellen.
Florenz Kley
Ich glaube nicht, dass man dito sagen kann, dass man Verzeichnis-Hardlinks beibehalten soll. Manpage sagt, dass es nur Hardlinks gibt
Chris F Carroll
0

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

Florenz Kley
quelle