POSIXly, Anda akan gunakan pax
dalam mode baca + tulis dengan -l
opsi:
pax -rwlpe -s /A/B/ dirA .
( -pe
Mempertahankan semua atribut kemungkinan file (dalam hal ini hanya direktori) yang disalin, seperti GNU cp
's -a
tidak).
Sekarang, meskipun standar , perintah itu belum tentu sangat portabel .
Pertama, banyak sistem berbasis GNU / Linux tidak termasuk pax
secara 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 -rwl
bersama 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,
pax
tidak 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 -> AA
symlink di dirA
, itu akan menjadi foo -> BA
di dirB
.
Juga, jika Anda ingin melakukan hal yang sama tetapi dengan jalur file yang sewenang-wenang yang isinya disimpan dalam $src
dan $dst
, penting untuk disadari bahwa pax -rwl -- "$src" "$dst"
menciptakan struktur direktori penuh $src
di dalam $dst
(yang harus ada dan menjadi direktori). Misalnya, jika $src
ini foo/bar
, maka, $dst/foo/bar
dibuat.
Jika sebaliknya, Anda ingin $dst
menjadi 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 $dst
berakhir pada karakter baris baru).
Sekarang itu tidak akan membantu pada sistem GNU / Linux di mana tidak ada pax
.
Sangat menarik untuk dicatat bahwa pax
diciptakan oleh POSIX untuk menggabungkan fitur tar
dan cpio
perintah.
cpio
adalah perintah Unix historis (dari 1977) yang bertentangan dengan penemuan POSIX, dan ada implementasi GNU juga (bukan pax
satu). 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 -rwl
akan 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
( find
dan cpio
dikembangkan bersama oleh orang yang sama)).
- metadata tidak dilestarikan (beberapa
cpio
implementasi 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 -a
tidak memiliki tautan tautan keras.