Cara termudah adalah menyalin seluruh arsip; Saya kira Anda tidak ingin melakukan itu karena terlalu besar.
Alat baris perintah yang biasa ( tar
, pax
) tidak mendukung menyalin anggota arsip ke arsip lain.
Jika Anda tidak perlu mempertahankan kepemilikan, saya sarankan menggunakan filesystem FUSE . Anda dapat menggunakan archivemount untuk me-mount arsip sebagai sistem file; lakukan ini untuk arsip sumber, dan jalankan tar pada sistem file yang terpasang.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Atau, Anda dapat menggunakan AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Atau, Anda dapat menjalankan tar
arsip asli dan mengekstrak ke mesin jarak jauh melalui SSHFS .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Namun semua metode ini rumit jika Anda perlu mempertahankan kepemilikan. Semuanya melibatkan pengekstrakan ke file di mesin lokal, jadi kepemilikan file ini harus menjadi kepemilikan jarak jauh yang dimaksud . Ini membutuhkan berjalan sebagai root dan mungkin tidak memberikan hasil yang dimaksudkan jika file dimiliki oleh akun yang memiliki nama atau ID yang berbeda antara mesin lokal dan host jarak jauh.
tarfile
Pustaka Python menyediakan cara yang cukup mudah untuk memanipulasi anggota tar, sehingga Anda dapat mengocoknya dari satu file tar ke yang lain. Ini mendukung format standar POSIX (ustar, pax) serta beberapa ekstensi GNU. Berikut ini adalah skrip Python yang belum teruji yang membaca file tar (mungkin dikompres dengan gzip atau bzip2) pada input standarnya dan menulis file tar yang dikompres dengan bzip2 pada output standarnya. Anggota dari sumber disalin jika mereka mulai dengan argumen yang diteruskan ke skrip.
#!/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()
Untuk dipanggil sebagai
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
pendekatan ini dimungkinkan dengan bsdtar. Tampaknya bekerja dengan atribut yang diperluas dan kompresi juga,</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(dan karena alasan tertentu pilihan kosong menghasilkan serangkaian nol byte, tapi itu bukan masalah besar bagi saya).