POSIXly würden Sie pax
im Lese- + Schreibmodus mit der -l
Option verwenden:
pax -rwlpe -s /A/B/ dirA .
( -pe
Bewahrt alle möglichen Attribute von Dateien (in diesem Fall nur Verzeichnisse) , die kopiert werden, wie GNU cp
‚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.
- Aufgrund eines Fehlers
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")
anstatt link("dirA/file", "dirB/file")
.
- Erstellt unter FreeBSD
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 ein foo -> AA
Symlink in vorhanden ist dirA
, wird er foo -> BA
in dirB
.
Wenn Sie dasselbe tun möchten, jedoch mit beliebigen Dateipfaden, deren Inhalt in $src
und gespeichert ist $dst
, ist es wichtig zu wissen , dass pax -rwl -- "$src" "$dst"
die vollständige Verzeichnisstruktur von $src
inside erstellt wird $dst
(das muss existieren und ein Verzeichnis sein). Zum Beispiel, wenn $src
ist foo/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:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
( $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 Befehle tar
und zusammenzuführen cpio
.
cpio
ist ein historischer Unix-Befehl (von 1977) im Gegensatz zu einer POSIX-Erfindung, und es gibt auch eine GNU-Implementierung (keine eine pax
). 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äre cpio -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)
- Alle Dateien müssen angegeben werden (in der Regel geben Sie die Ausgabe von
find
( find
und cpio
wurden gemeinsam von denselben Personen entwickelt)).
- Metadaten werden nicht beibehalten (bei einigen
cpio
Implementierungen gibt es Optionen zum Beibehalten einiger, aber keine portierbaren).
Also mit cpio
:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
pax
FreeBSDcp -a
nicht hart verlinkt werden.