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:
cd ~/.avfs/path/to/original.tar.gz\#
pax -w -s '/^.*\.jpg$//' | gzip >/path/to/filtered.tar.gz # POSIX
tar -czf /path/to/filtered.tar.gz -s '/^.*\.jpg$//' . # BSD
tar -czf /path/to/filtered.tar.gz --transform '/^.*\.jpg$//' . # GNU
Avec des outils plus primitifs, extrayez d'abord les fichiers à l'exclusion des .jpg
fichiers, puis créez une nouvelle archive.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Si votre goudron a --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
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'elle tar
agit comme un filtre de stdin
à 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…
#!/usr/bin/python
import re, sys, tarfile
source = tarfile.open(fileobj=sys.stdin, mode='r|*')
dest = tarfile.open(fileobj=sys.stdout, mode='w|gz')
for member in source:
if not (member.isreg() and re.match(r'.*\.jpg\Z', member.name)):
sys.stderr.write(member.name + '\n')
dest.addfile(member, source.extractfile(member))
dest.close()