Supprimer des fichiers de l'archive tar

17

J'ai un gros fichier foo.tar.xzqui contient beaucoup (disons 200000) de fichiers. J'ai compris que cette archive contient des fichiers (environ 5000) que je ne veux pas. Je n'ai pas suffisamment d'espace disque pour décompresser le tout sur mon disque; en outre, je crains que les attributs / droits ne se perdent si je le fais. J'ai cependant assez d'espace pour héberger deux copies de l' archive compressée . Existe-t-il un outil pour supprimer certains fichiers de l'archive (spécifié avec une expression régulière sur le nom de fichier) à la volée, c'est-à-dire sans décompresser l'archive dans des fichiers individuels?

FUZxxl
la source

Réponses:

15

GNU tar a une --deleteoption qui fonctionne aussi avec les archives de nos jours.

Utilisez-le comme ceci, par exemple:

tar -vf yourArchive.tar --delete your/path/to/delete

Attention: il ne fonctionnera probablement pas sur tout type de support de bande magnétique. Mais tarn'a aucun problème à travailler dans un tube, vous pouvez donc simplement utiliser un fichier tar temporaire et remplacer la bande par la suite. Il ne fonctionnera pas non plus sur les fichiers compressés, vous devrez donc décompresser le fichier.

En outre, l'opération sera plutôt lente dans tous les cas, en raison de la nature linéaire (par conception) des archives tar.

Evi1M4chine
la source
1
Il existe, mais il ne fonctionne pas avec des fichiers où l'accès aléatoire n'est pas possible (par exemple compresser des archives) mais c'est mon cas d'utilisation.
FUZxxl
1
L'autre problème est que je ne peux pas spécifier un modèle à supprimer. Notez mon commentaire de 2013 où j'ai déjà abordé les lacunes de gtar --delete.
FUZxxl
4
@FUZxxl -Tfonctionne avec --deleteet --wildcardsvous permet d'utiliser des modèles plutôt que des noms de fichiers, alors créez un fichier temporaire contenant les modèles et utilisez unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Il ne fera pas une expression régulière complète (si vous en avez besoin, utilisez simplement tar -tet établissez une liste de noms de fichiers à supprimer), juste des modèles de correspondance de noms de fichiers.
Random832
14

(édité, car j'ai mal compris la question, qui a également été éditée depuis)

Le mieux que vous puissiez faire est d'extraire, de supprimer et de recompresser l'intégralité du fichier.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Il n'est pas possible de supprimer directement des fichiers d'un tar.

tar est un flux, à l'origine destiné aux lecteurs de bande qui ne font pas de recherche aléatoire - alors qu'en théorie, il pourrait être possible sur un système de fichiers sur disque de percer un trou / réécrire le fichier restant, avec la compression le point est théorique comme la plupart sinon la totalité les méthodes de compression dépendent fortement du contenu qui s'est produit plus tôt dans le fichier. Pour ce faire, vous auriez besoin de connaissances très détaillées sur la méthode de compression ainsi que sur le format de fichier tar. Cette complexité est telle que personne ne s'en préoccuperait. Il est moins coûteux de simplement conserver les fichiers et de les ignorer.

Si vous avez besoin de cette fonctionnalité, tar n'est probablement pas ce que vous voulez.

frostschutz
la source
Ces fichiers représentent 35% de la taille des archives. Apparemment, les restrictions que vous signalez ne s'appliquent que si je réécris le fichier, pas si je le modifie à l'improviste, ce que je peux faire (j'ai suffisamment d'espace pour enregistrer deux fois l'archive compressée ). Existe-t-il un tel outil?
FUZxxl
J'ai peut-être mal compris votre question. Si vous êtes prêt à décompresser le goudron après tout, et à le reconditionner (juste sans réellement créer les fichiers goudronnés - c'est-à-dire, un canal goudron à goudron direct), cela peut être possible.
frostschutz
Ouais, je peux le faire. C'est juste que les fichiers ont des uids / gids / attributs que je dois conserver. De plus, je n'ai pas assez d'espace disque pour enregistrer la représentation décompressée. J'ai cependant assez d'espace pour enregistrer deux archives emballées.
FUZxxl
1
Ce n'est pas un problème du tout. Si je peux le faire en un seul passage, le temps ne sera pas trop long. Je ne peux imaginer aucun format d'archive permettant une suppression rapide tout en libérant du stockage.
FUZxxl
1
--wildcardsaide ... je devais inclure ./au début du modèle si ...
Gert van den Berg
-4

Selon le manuel , vous pouvez transmettre une liste de noms de fichiers tarà uniquement pour les extraire. Par exemple:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo
Don Juan dePython
la source
Je ne vois pas comment --extract m'aide. Pourriez-vous élaborer? Veuillez garder à l'esprit que je ne peux pas décompresser l'archive (ou une partie substantielle de celle-ci) sur le disque.
FUZxxl
2
Veuillez ne pas simplement publier des liens: il s'agit d'un wiki - ajoutez un contenu suffisant pour qu'il ne soit pas nécessaire que les gens quittent la page pour comprendre votre réponse.
jasonwryan