Wie kopiere ich Verzeichnisse unter Beibehaltung von Hardlinks?

40

Wie verschiebe ich Verzeichnisse mit gemeinsamen Dateien von einer Partition auf eine andere?

Nehmen wir an, wir haben eine Partition /mnt/Xmit Verzeichnissen gemountet, die Dateien mit Hardlinks gemeinsam nutzen. Wenn Sie solche Verzeichnisse auf eine andere Partition verschieben möchten, müssen Sie /mnt/Ydiese Hardlinks beibehalten.

Zur besseren Veranschaulichung, was ich unter "Verzeichnisse, die Dateien gemeinsam mit Hardlinks nutzen" verstehe, ist hier ein Beispiel:

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

Um genauer zu sein, nehmen wir an, dass die Gesamtgröße der Dateien 10 GB beträgt und jede Datei 10 Hardlinks hat. Die Frage ist, wie man es mit 10G ans Ziel verschiebt (jemand könnte sagen, dass es mit 100G kopiert und dann die Deduplizierung ausgeführt wird - es ist nicht das, wonach ich frage).

Grzegorz Wierzowiecki
quelle

Antworten:

29

Erste Antwort: The GNU Way

GNU- cp -aKopien behalten rekursiv so viele Strukturen und Metadaten wie möglich bei. Darin sind feste Verknüpfungen zwischen Dateien im Quellverzeichnis enthalten. -aVerwenden Sie diese Option, um die Beibehaltung fester Verknüpfungen speziell ohne alle anderen Funktionen von auszuwählen --preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst
Alan Curry
quelle
3
+1 auf tar, -1 für die Verwendung von gnu-spezifischen Argumenten für cp.
WhyNotHugo
Sie gaben drei Antworten in einer. Könnten Sie sie in drei Teile aufteilen, damit sie separat kommentiert und ausgewertet werden können? (Tipp: Sie können dies bearbeiten, um nur eine
Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki Split erreicht
Alan Curry
6
@Hugo: Es ist nichts Falsches daran, GNU-spezifische Argumente für Standardwerkzeuge zu verwenden. GNU-Versionen sind heutzutage der De-facto-Standard, und selbst wenn sie nicht vorinstalliert waren, war es üblich, GNU-Tools zu installieren (ich wusste, dass ich es immer getan habe - sie waren einfach besser als z. B. Solaris und * bsd-Versionen und sie stellten die Konsistenz zwischen verschiedenen * Nixen sicher. Es ist wahrscheinlich eine gute Praxis, auf GNUisms hinzuweisen, wenn Sie sie verwenden, dies jedoch nicht erforderlich ist. Auch Grzegorz hat nicht "Nicht unter Linux" gesagt, es ist also vernünftig anzunehmen, dass dies die Umgebung ist, von der er spricht.
cas
1
@WhyNotHugo: Wie ist POSIX "vielleicht mehr Standard?". POSIX hat uns dorthin gebracht, wo wir sind. Wussten Sie, dass alle Windows-Versionen seit Windows NT vollständig POSIX-kompatibel sind? Sie haben eine Pfadlängenbeschränkung von 255 Zeichen, wenn die POSIX-Datei-E / A-Funktionen verwendet werden, wodurch sie unbrauchbar werden. Wussten Sie, dass Solaris, Irix und HP-UX alle POSIX-kompatibel sind und sich dennoch alle Argumente für ihre Tools unterscheiden (z. B. tar)? cp -a ist eine Mindestanforderung für jede cp-Version, die die GNU-Kopie ersetzen möchte.
Johannes Overmann
36

rsync bietet hierfür die Option -Hoder --hard-linksund die üblichen Vorteile von rsync, da es angehalten und neu gestartet werden kann und erneut ausgeführt werden kann, um alle Dateien, die während oder nach der vorherigen Ausführung geändert wurden, effizient zu verarbeiten.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

Lesen Sie die rsyncManpage und suchen Sie nach -H. Es gibt dort viel mehr Details zu bestimmten Vorbehalten.

cas
quelle
2
Ich habe nachgesehen - es funktioniert.
Grzegorz Wierzowiecki
ja ich weiß. Ich benutze es seit Jahren in meinen Backup-Skripten. auch zum Verschieben von Dateien zwischen Dateisystemen wie in Ihrer Frage.
cas
rsync verwendet Speicherplatz beim Erstellen seiner Dateiliste. Für mich füllte es nach vielen Stunden "Dateiliste erstellen ..." meine 16 GB Speicher und war sicher, dass ich nichts kopiert hatte. YMMV.
msc
2
Von man rsync: Ab rsync 3.0.0 ist der verwendete rekursive Algorithmus jetzt ein inkrementeller Scan, der viel weniger Speicher als zuvor benötigt und die Übertragung startet, nachdem die ersten Verzeichnisse gescannt wurden. Dieser inkrementelle Scan wirkt sich nur auf unseren Rekursionsalgorithmus aus und ändert keine nicht rekursive Übertragung. Es ist auch nur möglich, wenn beide Enden der Übertragung mindestens Version 3.0.0 sind. Beachten Sie, dass beide --delete-beforeund --delete-afterdeaktivieren Sie diesen verbesserten Algorithmus.
cas
Auch wenn rsynces unglaublich nützlich ist, ist es nicht immer das beste Werkzeug für jeden Job. Heutzutage bevorzuge ich die Verwendung von ZFS-Datasets, damit ich Snapshots und zfs senddiese erstellen kann. Meistens verwende ich rsync auf Nicht-ZFS-Dateisystemen. btrfshat eine ähnliche Schnappschuss- und Sendefunktion.
cas
14

Dritte Antwort: Der POSIX-Weg

POSIX hat das tarDienstprogramm nicht standardisiert , obwohl es das tarArchivformat standardisiert hat . Das POSIX-Dienstprogramm zum Manipulieren von Tar-Archiven wird aufgerufen paxund verfügt über die Bonusfunktion, dass das Packen und Entpacken in einem einzigen Vorgang durchgeführt werden kann.

mkdir dst
pax -rw src dst
Alan Curry
quelle
10

Zweite Antwort: The Ancient UNIX Way

Erstellen Sie ein tar-Archiv im Quellverzeichnis, senden Sie es über eine Pipe und entpacken Sie es im Zielverzeichnis.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)
Alan Curry
quelle
1
geprüft -> funktioniert. Hardlinks erhalten.
Grzegorz Wierzowiecki
1
Gibt es einen Einblick, warum Hardlinks dadurch tatsächlich erhalten bleiben?
Peterph
1
Weil tarHardlinks erhalten bleiben. Zumindest in GNU tar können Sie dieses Verhalten mit--hard-dereference
cas
In meinem Fall hat tar beim Versuch, eine große Verzeichnishierarchie (eine TimeMachine-Sicherung) zu kopieren, einige harte Links beibehalten, die Datei jedoch in einigen Fällen repliziert. Ich denke, das liegt daran, dass die tar xnicht die vollständige Dateiliste hat, da die Dateien immer noch von der eingespeist werden tar c. Wenn Sie das gesamte Archiv vor dem Extrahieren gespeichert haben, ist dies wahrscheinlich in Ordnung. Ich würde mich sehr freuen, wenn jemand diese Theorie bestätigen könnte.
msc
10

Quelle: http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

Was Sie brauchen, um eine exakte Kopie zu erstellen, ist

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/
Pykler
quelle
Siehe meinen Kommentar zu rsync oben.
msc
1
Ich vermute, dass dadurch keine ACLs, erweiterten Attribute usw. kopiert werden. Die Linux-Version hat auch die Optionen -A und -X, um diese zu erhalten, aber ich denke, Sie haben unter MacOS Pech.
Edward Falk