Le moyen le plus simple serait de copier toute l'archive; Je suppose que vous ne voulez pas faire ça parce que c'est trop grand.
Les outils de ligne de commande habituels ( tar
,pax
) ne prennent pas en charge la copie des membres d'une archive vers une autre archive.
Si vous n'avez pas besoin de conserver la propriété, je vous suggère d'utiliser des systèmes de fichiers FUSE . Vous pouvez utiliser archivemount pour monter une archive en tant que système de fichiers; faites-le pour l'archive source et exécutez tar sur le système de fichiers monté.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Alternativement, vous pouvez utiliser AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Alternativement, vous pouvez exécuter tar
sur l'archive d'origine et extraire sur la machine distante via SSHFS .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Cependant, toutes ces méthodes sont lourdes si vous devez conserver la propriété. Ils impliquent tous d'extraire dans un fichier sur la machine locale, donc la propriété de ce fichier devra être celle prévue propriété distante . Cela nécessite d'être exécuté en tant que root et peut ne pas donner le résultat souhaité si les fichiers appartiennent à des comptes dont les noms ou les ID diffèrent entre la machine locale et l'hôte distant.
La tarfile
bibliothèque de Python fournit un moyen assez simple de manipuler les membres tar, vous pouvez donc les mélanger d'un fichier tar à un autre. Il prend en charge les formats standard POSIX (ustar, pax) ainsi que certaines extensions GNU. Voici un script Python non testé qui lit un fichier tar (éventuellement compressé avec gzip ou bzip2) sur son entrée standard et écrit un fichier tar compressé avec bzip2 sur sa sortie standard. Les membres de la source sont copiés s'ils commencent avec l'argument passé au script.
#!/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()
À invoquer en tant que
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
approche était possible avec bsdtar. Semble également fonctionner avec des attributs étendus et la compression</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(et pour une raison quelconque, une sélection vide produit une série de zéro octet, mais ce n'est pas un problème majeur pour moi).