POSIXly, bạn sẽ sử dụng pax
ở chế độ đọc + ghi với -l
tùy chọn:
pax -rwlpe -s /A/B/ dirA .
( -pe
Lưu giữ tất cả các thuộc tính có thể có của các file (trong trường hợp này chỉ danh bạ) được sao chép, như GNU cp
's -a
làm).
Bây giờ, mặc dù tiêu chuẩn , lệnh đó không nhất thiết phải rất cơ động .
Đầu tiên, nhiều hệ thống dựa trên GNU / Linux không bao gồm pax
theo mặc định (mặc dù đó là tiện ích POSIX không tùy chọn).
Sau đó, một số lỗi và không phù hợp với một vài triển khai gây ra một số vấn đề với mã đó.
- do lỗi, Solaris 10
pax
(ít nhất) không hoạt động khi sử dụng -rwl
kết hợp với -s
. Vì một số lý do, có vẻ như nó áp dụng thay thế cho cả đường dẫn gốc và sao chép. Vì vậy, ở trên, nó sẽ cố gắng làm một số link("dirB/file", "dirB/file")
thay vì link("dirA/file", "dirB/file")
.
- trên FreeBSD,
pax
không tạo liên kết cứng cho các tệp thuộc loại liên kết tượng trưng (hành vi được POSIX cho phép). Không chỉ vậy, nó còn áp dụng thay thế cho các mục tiêu của các liên kết tượng trưng (một hành vi không được POSIX cho phép). Vì vậy, ví dụ nếu có một foo -> AA
liên kết tượng trưng trong dirA
, nó sẽ trở nên foo -> BA
trong dirB
.
Ngoài ra, nếu bạn muốn làm tương tự nhưng với các đường dẫn tệp tùy ý có nội dung được lưu trữ $src
và $dst
, điều quan trọng là phải nhận ra rằng pax -rwl -- "$src" "$dst"
tạo cấu trúc thư mục đầy đủ $src
bên trong $dst
(phải tồn tại và là một thư mục). Ví dụ, nếu $src
là foo/bar
, sau đó, $dst/foo/bar
được tạo ra.
Nếu thay vào đó, bạn muốn $dst
trở thành một bản sao của $src
, dễ nhất có lẽ là làm như sau:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(cũng sẽ giải quyết hầu hết các vấn đề được đề cập ở trên nhưng sẽ thất bại nếu đường dẫn tuyệt đối $dst
kết thúc bằng các ký tự dòng mới).
Bây giờ điều đó sẽ không giúp ích cho các hệ thống GNU / Linux khi không có pax
.
Thật thú vị khi lưu ý rằng pax
đã được POSIX tạo ra để hợp nhất các tính năng của lệnh tar
và cpio
lệnh.
cpio
là một lệnh Unix lịch sử (từ năm 1977) trái ngược với phát minh POSIX và cũng có một triển khai GNU (không phải là pax
một). Vì vậy, mặc dù nó không còn là một lệnh tiêu chuẩn nữa (nó đã có trong SUSv2), nhưng nó vẫn rất phổ biến và có một bộ tính năng cốt lõi mà bạn thường có thể dựa vào.
Tương đương pax -rwl
sẽ là cpio -pl
. Tuy nhiên:
cpio
lấy danh sách tệp đầu vào trên stdin trái ngược với đối số (phân cách dòng mới có nghĩa là tên tệp có ký tự dòng mới không được hỗ trợ)
- Tất cả các tệp phải được chỉ định (thông thường bạn cung cấp cho nó đầu ra của
find
( find
và cpio
được cùng phát triển bởi cùng một người)).
- siêu dữ liệu không được bảo tồn (một số
cpio
triển khai có các tùy chọn để bảo tồn một số, nhưng không có gì có thể mang theo được).
Vì vậy, với cpio
:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
pax
, như trên FreeBSD,cp -a
không phải là liên kết tượng trưng liên kết cứng.