POSIXly, Anda akan gunakan paxdalam mode baca + tulis dengan -lopsi:
pax -rwlpe -s /A/B/ dirA .
( -peMempertahankan semua atribut kemungkinan file (dalam hal ini hanya direktori) yang disalin, seperti GNU cp's -atidak).
Sekarang, meskipun standar , perintah itu belum tentu sangat portabel .
Pertama, banyak sistem berbasis GNU / Linux tidak termasuk paxsecara default (meskipun itu utilitas POSIX non-opsional).
Kemudian, sejumlah bug dan ketidaksesuaian dengan beberapa implementasi menyebabkan sejumlah masalah dengan kode itu.
- karena bug, Solaris 10
pax(setidaknya) tidak berfungsi saat digunakan -rwlbersama dengan -s. Untuk beberapa alasan, tampaknya ini menerapkan substitusi ke path asli dan yang disalin. Jadi di atas, ia akan mencoba melakukan beberapa link("dirB/file", "dirB/file")alih-alih link("dirA/file", "dirB/file").
- di FreeBSD,
paxtidak membuat hardlink untuk file bertipe symlink (perilaku yang diizinkan oleh POSIX). Tidak hanya itu, tetapi juga menerapkan substitusi ke target symlinks (perilaku yang tidak diizinkan oleh POSIX). Jadi misalnya jika ada foo -> AAsymlink di dirA, itu akan menjadi foo -> BAdi dirB.
Juga, jika Anda ingin melakukan hal yang sama tetapi dengan jalur file yang sewenang-wenang yang isinya disimpan dalam $srcdan $dst, penting untuk disadari bahwa pax -rwl -- "$src" "$dst"menciptakan struktur direktori penuh $srcdi dalam $dst(yang harus ada dan menjadi direktori). Misalnya, jika $srcini foo/bar, maka, $dst/foo/bardibuat.
Jika sebaliknya, Anda ingin $dstmenjadi salinannya $src, yang termudah adalah melakukannya sebagai:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(yang juga akan mengatasi sebagian besar masalah yang disebutkan di atas tetapi akan gagal jika jalur absolut $dstberakhir pada karakter baris baru).
Sekarang itu tidak akan membantu pada sistem GNU / Linux di mana tidak ada pax.
Sangat menarik untuk dicatat bahwa paxdiciptakan oleh POSIX untuk menggabungkan fitur tardan cpioperintah.
cpioadalah perintah Unix historis (dari 1977) yang bertentangan dengan penemuan POSIX, dan ada implementasi GNU juga (bukan paxsatu). Jadi meskipun itu bukan lagi perintah standar (seperti pada SUSv2), itu masih sangat umum, dan ada serangkaian fitur yang biasanya dapat Anda andalkan.
Setara dengan pax -rwlakan cpio -pl. Namun:
cpio mengambil daftar file input pada stdin sebagai lawan dari argumen (baris baru dibatasi yang berarti nama file dengan karakter baris baru tidak didukung)
- Semua file harus ditentukan (biasanya Anda memberinya output
find( finddan cpiodikembangkan bersama oleh orang yang sama)).
- metadata tidak dilestarikan (beberapa
cpioimplementasi memiliki opsi untuk mempertahankan sebagian, tetapi tidak ada yang portabel).
Jadi dengan cpio:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
pax, pada FreeBSD,cp -atidak memiliki tautan tautan keras.