Angenommen, ich habe eine mit gzip komprimierte tar-ball compressArchive.tgz (+100 Dateien, insgesamt +5 GB).
Was wäre der schnellste Weg, um alle Einträge zu entfernen, die mit einem bestimmten Dateinamenmuster übereinstimmen, zum Beispiel mit dem Präfix * .jpg, und die Überreste dann wieder in einem gzip: ed tar-ball zu speichern?
Es ist nicht wichtig, das alte Archiv zu ersetzen oder ein neues zu erstellen, je nachdem, welches am schnellsten ist.
Antworten:
Mit GNU
tar
können Sie:Mit
bsdtar
:(
pigz
Ist die Multithread-Version vongzip
).Sie können die Datei wie folgt überschreiben:
Aber das ist ziemlich riskant, vor allem , wenn die Folge endet als weniger komprimiert als die Originaldatei (in diesem Fall, der zweite
pigz
kann das Überschreiben Bereich der Datei am Ende , die die erste noch nicht gelesen).quelle
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:
Extrahieren Sie mit primitiveren Tools zuerst die Dateien mit Ausnahme der
.jpg
Dateien und erstellen Sie dann ein neues Archiv.Wenn Ihr Teer hat
--exclude
: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 sietar
als Filter vonstdin
bis fungiertstdout
."). 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 ...quelle
tar
möchten Sie möglicherweise diep
Option hinzufügen .Mit dem Teer, der unter Mac OS X verfügbar ist, können Sie Folgendes tun:
quelle
Dazu müssen Sie wahrscheinlich den gesamten Inhalt der .tgz-Datei in ein lokales Verzeichnis extrahieren und dann die Dateien löschen, die Sie nicht möchten. Anschließend müssen Sie die .tgz-Datei erneut komprimieren.
Es ist lang und Sie benötigen ausreichend freien Speicherplatz, aber meines Wissens gibt es keine andere Möglichkeit, dies zu tun.
Vorausgesetzt , dass Sie bereits einige Pfad haben wie
/tmpdir/withalotofspace
DASS sufficent freien Speicherplatz (überprüfen Sie es mitdf -h /tmpdir/withalotofspace
), können Sie etwas tun:quelle
Ich mag die Antwort von @Gilles, außer es kann weiter vereinfacht werden. Nach dem Entpacken wird zum Beispiel
gunzip foo.tgz
die Dateifoo.tar
und Dateien können mit entfernt werdentar -f foo.tar --delete file|directory
. Unten sehen Sie ein Beispiel für das Entfernen eines Verzeichnisses aus einer TAR-Datei.Bestimmte Dateitypen finden Sie mit
tar -tf foo.tar|egrep -i '.jpg$'
.quelle