Am einfachsten wäre es, das gesamte Archiv zu kopieren. Ich nehme an, du willst das nicht, weil es zu groß ist.
Die üblichen Befehlszeilentools ( tar
, pax
) unterstützen das Kopieren von Mitgliedern eines Archivs in ein anderes Archiv nicht.
Wenn Sie die Inhaberschaft nicht beibehalten müssen, würde ich die Verwendung von FUSE- Dateisystemen vorschlagen . Mit archivemount können Sie ein Archiv als Dateisystem bereitstellen . Führen Sie dies für das Quellarchiv aus und führen Sie tar auf dem bereitgestellten Dateisystem aus.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Alternativ können Sie AVFS verwenden :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Alternativ können Sie tar
das ursprüngliche Archiv ausführen und über SSHFS auf den Remotecomputer extrahieren .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Alle diese Methoden sind jedoch umständlich, wenn Sie den Besitz behalten müssen. Bei allen handelt es sich um das Extrahieren in eine Datei auf dem lokalen Computer. Daher muss der Besitz dieser Datei der beabsichtigte Remote- Besitz sein. Dies erfordert die Ausführung als root und führt möglicherweise nicht zum gewünschten Ergebnis, wenn sich die Dateien im Besitz von Konten befinden, deren Namen oder IDs sich zwischen dem lokalen Computer und dem Remote-Host unterscheiden.
Die tarfile
Bibliothek von Python bietet eine relativ einfache Möglichkeit, Tar-Mitglieder zu bearbeiten, sodass Sie sie von einer Tar-Datei in eine andere mischen können. Es unterstützt POSIX-Standardformate (ustar, pax) sowie einige GNU-Erweiterungen. Hier ist ein ungetestetes Python-Skript, das eine Tar-Datei (möglicherweise mit gzip oder bzip2 komprimiert) in der Standardeingabe liest und eine mit bzip2 komprimierte Tar-Datei in der Standardausgabe schreibt. Die Elemente aus der Quelle werden kopiert, wenn sie mit dem an das Skript übergebenen Argument beginnen.
#!/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()
Aufruf als
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
Ansatz mit bsdtar möglich war. Scheint auch mit erweiterten Attributen und Komprimierung zu arbeiten</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(und aus irgendeinem Grund erzeugt eine leere Auswahl eine Reihe von Null-Bytes, aber das ist für mich kein großes Problem).