POSIXly, useresti paxin modalità read + write con l' -lopzione:
pax -rwlpe -s /A/B/ dirA .
( -peConserva tutti i possibili attributi di file (in questo caso solo directory) che vengono copiati, come GNU cp's -afa).
Ora, sebbene standard , quel comando non è necessariamente molto portatile .
Innanzitutto, molti sistemi basati su GNU / Linux non includono paxper impostazione predefinita (anche se si tratta di un'utilità POSIX non opzionale).
Quindi, una serie di bug e non conformità con alcune implementazioni causano una serie di problemi con quel codice.
- a causa di un bug, Solaris 10
pax(almeno) non funziona se utilizzato -rwlin combinazione con -s. Per qualche motivo, sembra che applichi la sostituzione sia al percorso originale che a quello copiato. Quindi sopra, tenterebbe di fare un po ' link("dirB/file", "dirB/file")invece di link("dirA/file", "dirB/file").
- su FreeBSD,
paxnon crea hardlink per file di tipo symlink (un comportamento consentito da POSIX). Non solo, ma applica anche la sostituzione alle destinazioni dei collegamenti simbolici (un comportamento non consentito da POSIX). Così, per esempio, se c'è un foo -> AAlink simbolico a dirA, diventerà foo -> BAin dirB.
Inoltre, se vuoi fare lo stesso ma con percorsi di file arbitrari il cui contenuto è archiviato $srce $dst, è importante rendersi conto che pax -rwl -- "$src" "$dst"crea l'intera struttura di directory di $srcinside $dst(che deve esistere ed essere una directory). Ad esempio, se $srcè foo/bar, quindi, $dst/foo/barviene creato.
Se invece vuoi $dstessere una copia di $src, il più semplice è probabilmente farlo come:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(che aggirerebbe anche la maggior parte dei problemi sopra menzionati ma fallirebbe se il percorso assoluto $dsttermina in caratteri di nuova riga).
Ora questo non sarà di aiuto sui sistemi GNU / Linux dove non c'è pax.
È interessante notare che è paxstato creato da POSIX per unire le funzionalità dei comandi tare cpio.
cpioè un comando Unix storico (dal 1977) in contrapposizione a un'invenzione POSIX, e c'è anche un'implementazione GNU (non una pax). Quindi, anche se non è più un comando standard (era in SUSv2), è comunque molto comune e c'è un set base di funzionalità su cui di solito puoi fare affidamento.
L'equivalente di pax -rwlsarebbe cpio -pl. Però:
cpio accetta l'elenco di file di input su stdin anziché su argomenti (delimitato da nuova riga, il che significa che i nomi di file con caratteri di nuova riga non sono supportati)
- Tutti i file devono essere specificati (in genere si alimenta l'output di
find( finde cpiosono stati sviluppati congiuntamente dalle stesse persone)).
- i metadati non vengono conservati (alcune
cpioimplementazioni hanno opzioni per preservarne alcune, ma nulla di portatile).
Quindi con cpio:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
paxsu FreeBSDcp -anon sono presenti collegamenti simbolici.