POSIXly, bạn sẽ sử dụng paxở chế độ đọc + ghi với -ltùy chọn:
pax -rwlpe -s /A/B/ dirA .
( -peLư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 -alà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 paxtheo 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 -rwlkế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,
paxkhô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 -> AAliên kết tượng trưng trong dirA, nó sẽ trở nên foo -> BAtrong 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ữ $srcvà $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 đủ $srcbên trong $dst(phải tồn tại và là một thư mục). Ví dụ, nếu $srclà foo/bar, sau đó, $dst/foo/barđược tạo ra.
Nếu thay vào đó, bạn muốn $dsttrở 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 $dstkế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 tarvà cpiolệnh.
cpiolà 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à paxmộ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 -rwlsẽ 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( findvà 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ố
cpiotriể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 -akhông phải là liên kết tượng trưng liên kết cứng.