วิธีที่ง่ายที่สุดคือการคัดลอกไฟล์เก็บถาวรทั้งหมด ฉันคิดว่าคุณไม่ต้องการทำเช่นนั้นเพราะมันใหญ่เกินไป
เครื่องมือบรรทัดคำสั่งปกติ ( tar
, pax
) ไม่สนับสนุนการคัดลอกสมาชิกของไฟล์เก็บถาวรไปยังไฟล์เก็บถาวรอื่น
หากคุณไม่ต้องการรักษาความเป็นเจ้าของฉันขอแนะนำให้ใช้ระบบไฟล์FUSE คุณสามารถใช้archivemountจะติดที่เก็บเป็นระบบแฟ้ม; ทำสิ่งนี้เพื่อเก็บถาวรซอร์สและรัน tar บนระบบไฟล์ที่เมาท์
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
หรือคุณสามารถใช้AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
หรือคุณสามารถเรียกใช้tar
ในการเก็บและสารสกัดจากเดิมไปยังเครื่องระยะไกลผ่านSSHFS
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
อย่างไรก็ตามวิธีการทั้งหมดนี้ยุ่งยากหากคุณต้องการรักษาความเป็นเจ้าของ พวกเขาทั้งหมดเกี่ยวข้องกับการแยกไฟล์ในเครื่องท้องถิ่นดังนั้นความเป็นเจ้าของไฟล์นี้จะต้องเป็นเจ้าของระยะไกลที่ตั้งใจไว้ สิ่งนี้ต้องการการทำงานในฐานะรูทและอาจไม่ให้ผลลัพธ์ตามที่ตั้งใจหากไฟล์นั้นเป็นของบัญชีที่มีชื่อหรือรหัสที่แตกต่างกันระหว่างเครื่องโลคอลและรีโมตโฮสต์
tarfile
ไลบรารีของ Python มีวิธีที่ง่ายในการจัดการสมาชิก tar ดังนั้นคุณสามารถสับเปลี่ยนจากไฟล์ tar หนึ่งไปยังอีกไฟล์หนึ่งได้ สนับสนุนรูปแบบมาตรฐาน POSIX (ustar, pax) รวมถึง GNU บางส่วน นี่คือสคริปต์ Python ที่ยังไม่ทดลองซึ่งอ่านไฟล์ tar (อาจบีบอัดด้วย gzip หรือ bzip2) ในอินพุตมาตรฐานและเขียนไฟล์ tar ที่บีบอัดด้วย bzip2 บนเอาต์พุตมาตรฐาน สมาชิกจากแหล่งที่มาจะถูกคัดลอกหากพวกเขาเริ่มต้นด้วยการโต้แย้งส่งผ่านไปยังสคริปต์
#!/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()
ที่จะเรียกว่า
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
วิธีนี้เป็นไปได้ด้วย bsdtar ดูเหมือนว่าจะทำงานกับคุณลักษณะที่เพิ่มขึ้นและการบีบอัดเช่นกัน</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(และด้วยเหตุผลบางอย่างการเลือกที่ว่างเปล่าจะสร้างชุดของศูนย์ไบต์ แต่นั่นไม่ใช่ปัญหาสำคัญสำหรับฉัน)