Najprostszym sposobem byłoby skopiowanie całego archiwum; Zakładam, że nie chcesz tego robić, ponieważ jest za duży.
Zwykłe narzędzia wiersza poleceń ( tar, pax) nie obsługują kopiowania członków archiwum do innego archiwum.
Jeśli nie musiałeś zachowywać własności, sugerowałbym użycie systemów plików FUSE . Możesz użyć archivemount do zamontowania archiwum jako systemu plików; zrób to dla archiwum źródłowego i uruchom tar na zamontowanym systemie plików.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Alternatywnie możesz użyć AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Alternatywnie możesz uruchomić taroryginalne archiwum i rozpakować je na zdalnym komputerze za pośrednictwem SSHFS .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Jednak wszystkie te metody są uciążliwe, jeśli chcesz zachować własność. Wszystkie wymagają wypakowania do pliku na komputerze lokalnym, więc właścicielem tego pliku będzie musiała być zamierzona własność zdalna . Wymaga to działania jako root i może nie przynieść zamierzonego rezultatu, jeśli pliki są własnością kont o nazwach lub identyfikatorach różniących się między komputerem lokalnym a hostem zdalnym.
tarfileBiblioteka Pythona zapewnia dość łatwy sposób manipulowania elementami tar, dzięki czemu można je przetasować z jednego pliku tar do drugiego. Obsługuje standardowe formaty POSIX (ustar, pax), a także niektóre rozszerzenia GNU. Oto nieprzetestowany skrypt Pythona, który odczytuje plik tar (ewentualnie skompresowany za pomocą gzip lub bzip2) na standardowym wejściu i zapisuje plik tar skompresowany za pomocą bzip2 na standardowym wyjściu. Członkowie ze źródła są kopiowani, jeśli zaczynają od argumentu przekazanego do skryptu.
#!/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()
Być wywoływanym jako
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tarpodejście jest możliwe dzięki bsdtar. Wydaje się, że działa również z rozszerzonymi atrybutami i kompresją</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz(i z jakiegoś powodu pusty wybór generuje serię zerowych bajtów, ale to nie jest dla mnie poważny problem).