Cách dễ nhất sẽ là sao chép toàn bộ kho lưu trữ; Tôi đoán bạn không muốn làm điều đó vì nó quá lớn.
Các công cụ dòng lệnh thông thường ( tar
, pax
) không hỗ trợ sao chép các thành viên của kho lưu trữ sang kho lưu trữ khác.
Nếu bạn không cần giữ quyền sở hữu, tôi khuyên bạn nên sử dụng các hệ thống tập tin FUSE . Bạn có thể sử dụng archivemount để gắn kết một kho lưu trữ như một hệ thống tập tin; làm điều này cho kho lưu trữ nguồn và chạy tar trên hệ thống tập tin được gắn kết.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Ngoài ra, bạn có thể sử dụng AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Ngoài ra, bạn có thể chạy tar
trên kho lưu trữ ban đầu và giải nén vào máy từ xa qua SSHFS .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Tuy nhiên tất cả các phương pháp này đều cồng kềnh nếu bạn cần giữ quyền sở hữu. Tất cả đều liên quan đến việc trích xuất một tệp trên máy cục bộ, vì vậy quyền sở hữu của tệp này sẽ phải là quyền sở hữu từ xa dự định . Điều này yêu cầu chạy dưới quyền root và có thể không cho kết quả như mong muốn nếu các tệp được sở hữu bởi các tài khoản có tên hoặc ID khác nhau giữa máy cục bộ và máy chủ từ xa.
tarfile
Thư viện của Python cung cấp một cách khá dễ dàng để thao tác các thành viên tar, vì vậy bạn có thể xáo trộn chúng từ tệp tar này sang tệp tar khác. Nó hỗ trợ các định dạng chuẩn POSIX (ustar, pax) cũng như một số phần mở rộng GNU. Đây là tập lệnh Python chưa được kiểm tra đọc tệp tar (có thể được nén bằng gzip hoặc bzip2) trên đầu vào tiêu chuẩn của nó và ghi tệp tar được nén bằng bzip2 trên đầu ra tiêu chuẩn của nó. Các thành viên từ nguồn được sao chép nếu họ bắt đầu với đối số được truyền cho tập lệnh.
#!/usr/bin/env python2
import sys, tarfile
source = tarfile.open(fileobj=sys.stdin)
destination = tarfile.open(fileobj=sys.stdout, mode='w:bz2')
for info in source:
if info.name.startswith(sys.argv[1]):
destination.addfile(info)
destination.close()
Được gọi là
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
phương pháp này là có thể với bsdtar. Có vẻ như cũng hoạt động với các thuộc tính mở rộng và nén,</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(và vì một số lý do, một lựa chọn trống tạo ra một chuỗi các byte bằng 0, nhưng đó không phải là vấn đề lớn đối với tôi).