POSIXly, używałbyś paxw trybie odczytu i zapisu z -lopcją:
pax -rwlpe -s /A/B/ dirA .
( -peZachowuje wszystkie możliwe atrybuty plików (w tym przypadku jedynie katalogi), które są skopiowane, jak GNU cp„s -arobi).
Teraz, chociaż standardowe , to polecenie niekoniecznie jest bardzo przenośne .
Po pierwsze, wiele systemów opartych na GNU / Linux nie zawiera paxdomyślnie (chociaż nie jest to opcjonalne narzędzie POSIX).
Następnie szereg błędów i niezgodności z kilkoma implementacjami powoduje szereg problemów z tym kodem.
- z powodu błędu Solaris 10
pax(przynajmniej) nie działa, gdy jest używany -rwlw połączeniu z -s. Z jakiegoś powodu wydaje się, że stosuje podstawienie zarówno do oryginalnej, jak i skopiowanej ścieżki. Tak więc powyżej spróbowałby zrobić coś link("dirB/file", "dirB/file")zamiast link("dirA/file", "dirB/file").
- na FreeBSD
paxnie tworzy twardych dowiązań dla plików typu dowiązanie symboliczne (zachowanie dozwolone przez POSIX). Nie tylko to, ale również stosuje się substytucję do celów dowiązania (zachowanie nie dozwolonych przez POSIX). Tak na przykład, jeśli istnieje foo -> AAdowiązanie w dirA, stanie foo -> BAsię dirB.
Ponadto, jeśli chcesz zrobić to samo, ale z dowolnych ścieżek plik, którego zawartość jest przechowywana w $srci $dstważne jest, aby uświadomić sobie, że pax -rwl -- "$src" "$dst"tworzy pełną strukturę katalogów $srcwewnętrznej $dst(który musi istnieć i być katalogiem). Na przykład, jeśli $srcjest foo/bar, to $dst/foo/barjest tworzone.
Jeśli zamiast tego chcesz $dstbyć kopią $src, najłatwiej jest to zrobić:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(co obejdzie również większość wyżej wymienionych problemów, ale zawiedzie, jeśli bezwzględna ścieżka $dstkońca kończy się na znakach nowej linii).
Teraz to nie pomoże w systemach GNU / Linux, gdzie nie ma pax.
Warto zauważyć, że paxzostał stworzony przez POSIX w celu scalenia funkcji poleceń tari cpio.
cpiojest historycznym poleceniem uniksowym (z 1977 r.) w przeciwieństwie do wynalazku POSIX, a także implementacją GNU (nie paxjedną). Tak więc, mimo że nie jest to już standardowe polecenie (choć było w SUSv2), wciąż jest bardzo powszechne i istnieje podstawowy zestaw funkcji, na których zwykle można polegać.
Odpowiednikiem pax -rwlbyłoby cpio -pl. Jednak:
cpio pobiera listę plików wejściowych na stdin w przeciwieństwie do argumentów (znak nowej linii, co oznacza, że nazwy plików ze znakami nowej linii nie są obsługiwane)
- Wszystkie pliki muszą zostać określone (zazwyczaj podajesz dane wyjściowe
find( findi cpiozostały opracowane wspólnie przez te same osoby)).
- metadane nie są zachowywane (niektóre
cpioimplementacje mają opcje zachowania niektórych, ale nic przenośnego).
Więc z cpio:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
paxwe FreeBSD,cp -anie łączy dowiązań symbolicznych.