Diskontieren Sie nicht den einfachen Weg: Es kann für Ihren Zweck schnell genug sein. Mit avfs können Sie als Verzeichnis auf das Archiv zugreifen:
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
Extrahieren Sie mit primitiveren Tools zuerst die Dateien mit Ausnahme der .jpgDateien und erstellen Sie dann ein neues Archiv.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Wenn Ihr Teer hat --exclude:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Dies kann jedoch den Besitz und die Modi von Dateien beeinträchtigen, wenn Sie sie nicht als Root ausführen. Verwenden Sie für optimale Ergebnisse ein temporäres Verzeichnis auf einem schnellen Dateisystem - tmpfs, wenn Sie eines haben, das groß genug ist.
Die Unterstützung für Archivierer, die als Passthrough fungieren (dh ein Archiv lesen und ein Archiv schreiben), ist in der Regel begrenzt. GNU tar kann mit der --deleteOption operation Mitglieder aus einem Archiv löschen ("Die --deleteOption hat sich als richtig erwiesen, wenn sie tarals Filter von stdinbis fungiert stdout."). Dies ist wahrscheinlich die beste Option für Sie.
In einigen Zeilen von Python können Sie leistungsstarke Archivfilter erstellen. Die tarfileBibliothek kann aus nicht suchbaren Streams lesen und schreiben, und Sie können beliebigen Code in Python verwenden, um zu filtern, umzubenennen, zu ändern ...
#!/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()