Hinzufügen von Dateien zu TBZ-Dateien

8

Ich suche nach einer Möglichkeit, Tausende von .tbz-Archivdateien zu aktualisieren, daher mache ich dies mit einem Shell-Skript. Ich muss jeder eine Datei hinzufügen.

Meine Frage ist, gibt es eine schnellere Möglichkeit, dies zu tun, ohne den Inhalt jedes TBZ zu extrahieren und dann mit der neuen Datei, die im enthaltenen Teer enthalten ist, erneut zu komprimieren? Wie würden die Befehle aussehen?

Vielen Dank

BottleZero
quelle
Eine naheliegende Alternative besteht darin, komprimierte Dateien in einen unkomprimierten Tarball zu legen. Dies ändert jedoch das Datenformat, sodass es für Sie möglicherweise nicht realisierbar ist, und es kann für eine große Anzahl kleiner Dateien mit Redundanz zwischen diesen ineffizient sein.
Stellen Sie Monica

Antworten:

12

Während tarDateien zu einem bereits vorhandenen Archiv hinzugefügt werden können, können diese nicht komprimiert werden. Sie müssen bunzip2das komprimierte Archiv verlassen und einen Standard-Tarball hinterlassen. Sie können dann die tarFähigkeit verwenden, Dateien zu einem vorhandenen Archiv hinzuzufügen und dann mit erneut zu komprimieren bzip2.

Aus dem Handbuch:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.
DopeGhoti
quelle
es ist in der Tat wahr
Kiwy
Dies ist eine Methode, aber nicht die einzige. Es ist möglich, einen bzip2-Stream zu ändern, ohne ihn vollständig zu dekomprimieren. Ich weiß nicht, ob es möglich ist, es so anzuhängen , dass es sauber an ein Teerarchiv angehängt werden kann , aber dhag zeigt eine Teilmethode .
Gilles 'SO - hör auf böse zu sein'
10

Die andere Antwort ist richtig: Sie können ein komprimiertes Teerarchiv nicht ordnungsgemäß aktualisieren, ohne es zu dekomprimieren. Die GNU-TAR-Dokumentation weist darauf hin, und der Versuch, ein Update durchzuführen, schlägt mit einer expliziten Fehlermeldung fehl:

$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

Allerdings sollten Sie in einem schmutzigen interessiert sein Art-of-Werk - Lösung , die nicht Dekompression erfordert, kann ich ein, liefern basierend auf den folgenden Beobachtungen:

  • Das Anhängen von bzip2-Streams mit catwird unterstützt und erzeugt einen gültigen bzip2-Stream (dasselbe gilt für gzip).
  • Das Anhängen von Tars mit caterzeugt keine gültige TAR-Datei, weshalb die --concatenateOption vorhanden ist. Wir können jedoch TAR bitten, so zu tun, als ob sie gültig wäre:

Es mag Ihnen intuitiver erscheinen, zwei Archive mit cat zu verketten oder zu versuchen, anstatt die --concatenateOperation zu verwenden. Schließlich ist cat das Dienstprogramm zum Kombinieren von Dateien.

Tar-Archive enthalten jedoch eine Dateiende-Markierung, die entfernt werden muss, wenn die verketteten Archive ordnungsgemäß als ein Archiv gelesen werden sollen. --concatenateEntfernt die Markierung für das Ende des Archivs aus dem Zielarchiv, bevor jedes neue Archiv angehängt wird. Wenn Sie die Archive mit cat kombinieren, ist das Ergebnis kein gültiges Archiv im Tar-Format. Wenn Sie Dateien aus einem Archiv abrufen müssen, das mit dem Dienstprogramm cat hinzugefügt wurde, verwenden Sie die Option --ignore-zeros( -i).

Basierend auf diesem Wissen können wir zum Beispiel Folgendes tun:

cat {one,two}.tar.bz2 >combined.tar.bz2

Dies führt, wie im obigen Dokumentationsausschnitt erläutert, zu einer ungültigen TAR-Datei, deren Verwendung --ignore-zerosjedoch weiterhin vollständig gelesen werden kann:

## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b

## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c

## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c

Beachten Sie, wie oben alle drei Dateien aus den beiden ursprünglichen Archiven -iaufgelistet werden , während beim Weglassen (korrekt) nur die Dateien aus dem ersten Originalarchiv aufgelistet werden:

$ tar tf combined.tar.bz2 
a
b

Auch dies ist nichts weiter als ein schmutziger Trick, aber es kann nützlich sein, wenn Sie sowohl die Schreib- als auch die Leseseite steuern und sicherstellen können, dass -idies beim Versuch verwendet wird, aus auf diese Weise erstellten Dateien zu lesen.

dhag
quelle
Das sehr interessante Dankeschön für die ausführliche Antwort. Leider habe ich keine Kontrolle über den Prozess, der diese Archive letztendlich lesen wird.
BottleZero
Dies kann verwendet werden, um einige Dateien in einem Archiv zu "verstecken", so dass jemand, der beiläufig extrahiert, nur den Inhalt des ursprünglichen Tarballs erhält, aber diejenigen, die wissen, dass sie die izur Befehlszeile hinzufügen , sehen das Ganze.
Monty Harder