Considérez un seul fichier tar d'un système externe qui contient certains répertoires avec divers attributs que je souhaite conserver tels que des autorisations, des mtimes, etc. Comment puis-je facilement prendre un sous-ensemble de ces fichiers en tant qu'utilisateur normal (pas root)?
Vous cherchez quelque chose comme:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
Il est également essentiel que les principaux attributs (propriété, groupe, mode, mtime) de cette archive tar soient conservés. Qu'en est-il des autres attributs d'un fichier tar tels que les mots-clés d'en-tête étendus ?
Points bonus pour une solution qui évite l'utilisation d'un répertoire temporaire au cas où ce sous-répertoire contiendrait des fichiers volumineux.
@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).s/old/new/
ne fonctionne pas sur les fichiers provenant d'anciennes archives utilisant @ old.tgz, il ne fonctionne que sur des fichiers réels, en archivant directement depuis le système de fichiers. C'est vraiment dommage, car ce serait le cas d'utilisation le plus utile pour moi.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é.
Alternativement, vous pouvez utiliser AVFS :
Alternativement, vous pouvez exécuter
tar
sur l'archive d'origine et extraire sur la machine distante via SSHFS .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.À invoquer en tant que
la source
Une autre approche sans privilège consiste à utiliser le
fakeroot
programme pour prétendre que vous êtes autorisé à changer de propriétaire. Bien que d'autres attributs tar soient perdus, il conserve le mode, mtime et uid / gid. Ces commandes créent un répertoire temporaire, extraient un sous-ensemble des fichiers et créent enfin une nouvelle archive:la source
GNU
tar
a une--delete
option:De cette façon, vous pouvez obtenir un sous-ensemble du tar d'entrée en spécifiant ce qui ne doit pas être inclus dans la sortie.
Malheureusement, je ne pouvais pas obtenir l'
--exclude
option de travailler avec--delete
, il semble donc que vous devez d'abord obtenir une liste explicite (-t
) des choses à supprimer, puis la transmettre à une autre invocation detar
.Ou vous pouvez stocker la liste dans un fichier externe s'il est trop long ou complexe:
la source
D'après ce que je sais, la
tar
commande ne peut pas utiliser le format tar à la fois comme entrée et sortie. Vous devrez extraire vos fichiers localement d'une manière ou d'une autre et utiliser à nouveau tar pour créer un fichier tar à la volée, avec quelque chose comme ça (le-
moyen d'entrée / sortie standard est utilisé à la place d'un fichier):Notez
tar
qu'être capable d'extraire un fichier tar directement dans un autre fichier tar est une idée intéressante ...la source