POSIXly würden Sie paxim Lese- + Schreibmodus mit der -lOption verwenden:
pax -rwlpe -s /A/B/ dirA .
( -peBewahrt alle möglichen Attribute von Dateien (in diesem Fall nur Verzeichnisse) , die kopiert werden, wie GNU cp‚s der -aFall ist).
Obwohl dies Standard ist , ist dieser Befehl nicht unbedingt sehr portabel .
Erstens enthalten viele GNU / Linux-basierte Systeme paxstandardmäß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
paxfunktioniert Solaris 10 (zumindest) nicht, wenn es -rwlin 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
paxkeine 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 -> AASymlink in vorhanden ist dirA, wird er foo -> BAin dirB.
Wenn Sie dasselbe tun möchten, jedoch mit beliebigen Dateipfaden, deren Inhalt in $srcund gespeichert ist $dst, ist es wichtig zu wissen , dass pax -rwl -- "$src" "$dst"die vollständige Verzeichnisstruktur von $srcinside erstellt wird $dst(das muss existieren und ein Verzeichnis sein). Zum Beispiel, wenn $srcist foo/bar, dann $dst/foo/barwird erstellt.
Wenn Sie stattdessen $dsteine Kopie von sein möchten , $srcist 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")
( $dstDies 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 paxwurde POSIX erstellt, um die Funktionen der Befehle tarund zusammenzuführen cpio.
cpioist 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 -rwlwä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( findund cpiowurden gemeinsam von denselben Personen entwickelt)).
- Metadaten werden nicht beibehalten (bei einigen
cpioImplementierungen 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")
paxFreeBSDcp -anicht hart verlinkt werden.