Supposons que j'ai un tar-ball compressé gzip compresséArchive.tgz (+100 fichiers, totalisant + 5 Go).
Quel serait le moyen le plus rapide de supprimer toutes les entrées correspondant à un modèle de nom de fichier donné, par exemple le préfixe * .jpg, puis de stocker à nouveau les restes dans une tar-ball gzip: ed?
Le remplacement de l'ancienne archive ou la création d'une nouvelle n'est pas important, selon la plus rapide.
Réponses:
Avec GNU
tar
, vous pouvez faire:Avec
bsdtar
:(
pigz
étant la version multi-thread degzip
).Vous pouvez écraser le fichier sur lui-même comme:
Mais c'est assez risqué, surtout si le résultat finit par être moins compressé que le fichier d'origine (dans ce cas, le second
pigz
peut finir par écraser les zones du fichier que le premier n'a pas encore lues).la source
Ne négligez pas la manière simple: elle peut être assez rapide pour votre objectif. Avec avfs pour accéder à l'archive en tant que répertoire:
Avec des outils plus primitifs, extrayez d'abord les fichiers à l'exclusion des
.jpg
fichiers, puis créez une nouvelle archive.Si votre goudron a
--exclude
:Cela peut cependant modifier la propriété et les modes du fichier si vous ne l'exécutez pas en tant que root. Pour de meilleurs résultats, utilisez un répertoire temporaire sur un système de fichiers rapide - tmpfs si vous en avez un assez grand.
La prise en charge des archiveurs pour agir en tant qu'intermédiaire (c'est-à-dire lire une archive et écrire une archive) a tendance à être limitée. GNU tar peut supprimer des membres d'une archive avec l'
--delete
option operation («L'--delete
option a été rapportée pour fonctionner correctement lorsqu'elletar
agit comme un filtre destdin
àstdout
.»), Et c'est probablement votre meilleure option.Vous pouvez créer des filtres d'archivage puissants dans quelques lignes de Python. Sa
tarfile
bibliothèque peut lire et écrire à partir de flux non recherchés, et vous pouvez utiliser du code arbitraire en Python pour filtrer, renommer, modifier…la source
tar
, vous souhaiterez peut-être ajouter l'p
option.Avec le tar qui vient sur Mac OSX, vous pouvez faire ceci:
la source
Pour ce faire, vous devrez probablement extraire tout le contenu du fichier .tgz dans un répertoire local puis effacer les fichiers dont vous ne voulez pas puis recompresser le .tgz.
C'est long et vous avez besoin d'un espace disque suffisant, mais à ma connaissance, il n'y a pas d'autre moyen de le faire.
Étant donné que vous avez déjà un chemin comme
/tmpdir/withalotofspace
celui-ci qui a suffisamment d'espace libre (vérifiez-le en utilisantdf -h /tmpdir/withalotofspace
), vous pouvez faire quelque chose comme ceci:la source
J'aime la réponse de @Gilles, sauf qu'elle peut être encore simplifiée. Après la décompression, par exemple,
gunzip foo.tgz
le fichier serafoo.tar
et les fichiers peuvent être supprimés avectar -f foo.tar --delete file|directory
. Voici un exemple de suppression d'un répertoire d'un fichier tar.Des types de fichiers spécifiques peuvent être trouvés avec
tar -tf foo.tar|egrep -i '.jpg$'
.la source