Ich möchte eine "Kopie" eines Verzeichnisbaums erstellen, in dem jede Datei einen Hardlink zur Originaldatei darstellt
Beispiel: Ich habe eine Verzeichnisstruktur:
dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3
Hier ist das erwartete Ergebnis, eine "Kopie" des Verzeichnisbaums, in der jede Datei einen Hardlink zur Originaldatei darstellt:
dirB/ # normal directory
dirB/file1 # hardlink to dirA/file1
dirB/x/ # normal directory
dirB/x/file2 # hardlink to dirA/x/file2
dirB/y/ # normal directory
dirB/y/file3 # hardlink to dirA/y/file3
pax
FreeBSDcp -a
nicht hart verlinkt werden.POSIXly würden Sie
pax
im Lese- + Schreibmodus mit der-l
Option verwenden:(
-pe
Bewahrt alle möglichen Attribute von Dateien (in diesem Fall nur Verzeichnisse) , die kopiert werden, wie GNUcp
‚s der-a
Fall ist).Obwohl dies Standard ist , ist dieser Befehl nicht unbedingt sehr portabel .
Erstens enthalten viele GNU / Linux-basierte Systeme
pax
standardmäßig keine (obwohl dies ein nicht optionales POSIX-Dienstprogramm ist).Dann verursachen eine Reihe von Fehlern und Nichtkonformitäten mit einigen Implementierungen eine Reihe von Problemen mit diesem Code.
pax
funktioniert Solaris 10 (zumindest) nicht, wenn es-rwl
in Kombination mit verwendet wird-s
. Aus irgendeinem Grund wird anscheinend der ursprüngliche und der kopierte Pfad ersetzt. Also würde es oben versuchen, einige zu tun,link("dirB/file", "dirB/file")
anstattlink("dirA/file", "dirB/file")
.pax
keine Hardlinks für Dateien vom Typ symlink (ein von POSIX zugelassenes Verhalten). Darüber hinaus wird die Substitution auf die Ziele der Symlinks angewendet (ein von POSIX nicht zugelassenes Verhalten ). Wenn zum Beispiel einfoo -> AA
Symlink in vorhanden istdirA
, wird erfoo -> BA
indirB
.Wenn Sie dasselbe tun möchten, jedoch mit beliebigen Dateipfaden, deren Inhalt in
$src
und gespeichert ist$dst
, ist es wichtig zu wissen , dasspax -rwl -- "$src" "$dst"
die vollständige Verzeichnisstruktur von$src
inside erstellt wird$dst
(das muss existieren und ein Verzeichnis sein). Zum Beispiel, wenn$src
istfoo/bar
, dann$dst/foo/bar
wird erstellt.Wenn Sie stattdessen
$dst
eine Kopie von sein möchten ,$src
ist es wahrscheinlich am einfachsten, dies wie folgt zu tun:(
$dst
Dies würde auch die meisten der oben genannten Probleme umgehen , würde jedoch fehlschlagen, wenn der absolute Pfad von in Zeilenumbrüchen endet.)Nun, das wird auf GNU / Linux-Systemen, auf denen es keine gibt, nicht helfen
pax
.Interessanterweise
pax
wurde POSIX erstellt, um die Funktionen der Befehletar
und zusammenzuführencpio
.cpio
ist ein historischer Unix-Befehl (von 1977) im Gegensatz zu einer POSIX-Erfindung, und es gibt auch eine GNU-Implementierung (keine einepax
). Obwohl es sich nicht mehr um einen Standardbefehl handelt (es war allerdings in SUSv2), ist er dennoch weit verbreitet, und es gibt eine Reihe grundlegender Funktionen, auf die Sie sich normalerweise verlassen können.Das Äquivalent von
pax -rwl
wärecpio -pl
. Jedoch:cpio
Verwendet die Liste der Eingabedateien in stdin im Gegensatz zu Argumenten (durch Zeilenumbrüche getrennt, dh Dateinamen mit Zeilenumbrüchen werden nicht unterstützt)find
(find
undcpio
wurden gemeinsam von denselben Personen entwickelt)).cpio
Implementierungen gibt es Optionen zum Beibehalten einiger, aber keine portierbaren).Also mit
cpio
:quelle
-s /A/B
ersetztA
durchB
so dasdirA
wirddirB
. Wenn der Name Ihres Quellverzeichnisses neinA
lautet, wird er über sich selbst kopiert (verknüpft). Siehe auch den Rest der Antwort für möglicherweise bessere Ansätze.Kurze Antwort:
quelle
Falls Sie nach dieser Funktion zum Kopieren mit Hardlinks suchen , um Snapshots oder Backups Ihrer Dateien (ganz oder teilweise) zu erstellen, sehen Sie sich diese an
rsnapshot
.quelle
Die Antwort von @ gudmundur-orn ist richtig, aber wenn Sie auf BtrFS unter Linux sind,
cp a --reflink=auto dirA dirB
sollten Sie den Trick machen, mit dem Unterschied, dass die Dateien tatsächlich unterschiedlich sind und sich ändern, ändert sich nicht das eine. Mitcp -c
einem Mac mit APFS können Sie fast dasselbe erreichen (auto
führt eine vollständige Kopie durch, wenn dies nicht möglich ist,-c
schlägt fehl).Jedes COW-Dateisystem sollte dazu in der Lage sein, aber die Anbieter haben sich nicht auf eine Standard-Befehlszeilenoption geeinigt.
quelle