En kolay yol tüm arşivi kopyalamak olacaktır; Sanırım bunu yapmak istemiyorsunuz çünkü çok büyük.
Genel komut satırı araçları ( tar
, pax
) bir arşivin üyelerini başka bir arşive kopyalamayı desteklemez.
Sahipliği korumanız gerekmiyorsa, FUSE dosya sistemlerini kullanmanızı öneririm . Arşivi dosya sistemi olarak monte etmek için archivemount'u kullanabilirsiniz ; bunu kaynak arşivi için yapın ve bağlı dosya sisteminde tar çalıştırın.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Alternatif olarak, AVFS kullanabilirsiniz :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Alternatif olarak, tar
orijinal arşivde çalışabilir ve SSHFS üzerinden uzak makineye ayıklayabilirsiniz .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Ancak, sahipliğinizi korumanız gerekiyorsa, tüm bu yöntemler hantaldır. Hepsi yerel makinedeki bir dosyaya çıkarmayı içerir, bu nedenle bu dosyanın sahipliği istenen uzak sahiplik olmalıdır. Bu, root olarak çalışmayı gerektirir ve dosyalar yerel makine ile uzak ana makine arasında farklılık gösteren adlara veya kimliklere sahip hesaplara sahipse, amaçlanan sonucu vermeyebilir.
Python'un tarfile
kütüphanesi, katran üyelerini manipüle etmek için oldukça kolay bir yol sağlar, böylece onları bir katran dosyasından diğerine karıştırabilirsiniz. POSIX standart biçimlerini (ustar, pax) ve bazı GNU uzantılarını destekler. İşte standart girdisinde bir tar dosyasını (muhtemelen gzip veya bzip2 ile sıkıştırılmış) okuyan ve bzip2 ile sıkıştırılmış bir tar dosyasını standart çıktısına yazan test edilmemiş bir Python betiği. Kaynaktan üyeler, betiğe iletilen bağımsız değişkenle başlarlarsa kopyalanır.
#!/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()
Olarak çağrılmak
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
yaklaşımın bsdtar ile mümkün olduğunu bilmiyordum. Genişletilmiş öznitelikler ve sıkıştırma ile de çalışıyor gibi görünüyor</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(ve bir nedenden dolayı boş bir seçim bir dizi sıfır bayt üretiyor, ancak bu benim için büyük bir sorun değil).