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 .jpg
Dateien 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 --delete
Option operation Mitglieder aus einem Archiv löschen ("Die --delete
Option hat sich als richtig erwiesen, wenn sie tar
als Filter von stdin
bis fungiert stdout
."). Dies ist wahrscheinlich die beste Option für Sie.
In einigen Zeilen von Python können Sie leistungsstarke Archivfilter erstellen. Die tarfile
Bibliothek 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()