Linux - Gibt es eine Möglichkeit, .bz2-Dateien mithilfe von Pipes in .tar.bz2-Dateien zu konvertieren?

1907
endolith

Gibt es eine Möglichkeit, eine .bz2-Datei in eine .tar.bz2-Datei zu konvertieren, ohne die gesamte Datei auf die Festplatte zu dekomprimieren und anschließend erneut zu komprimieren? Die dekomprimierte Größe ist größer als mein Laufwerk. Da bz2 mit Blöcken arbeitet, könnte es so aussehen, als ob Sie einen Block einfach dekomprimieren, leiten, erneut komprimieren, den dekomprimierten Block aus dem Speicher entfernen usw.

Ich habe dies in den Ubuntu-Foren nachgefragt und keine Antwort gefunden.

5
Warum möchtest du das tun? matpie vor 14 Jahren 4
Ursprünglich sollte mit sehr großen Dateien gearbeitet werden, ohne sie zu dekomprimieren. Mit archivemount können Sie .tar.bz2 mounten (da sich darin "Dateisystem" befindet), jedoch nicht .bz2. endolith vor 14 Jahren 0
http://sourceforge.net/apps/mediawiki/fuse/index.php?title=ArchiveFileSystems endolith vor 14 Jahren 0

2 Antworten auf die Frage

3
quack quixote

Update: Meine ursprüngliche Antwort funktioniert überhaupt nicht, sorry. tarakzeptiert keinen Datenstrom von STDIN als Eingabe, daher schlägt der erste Befehl fehl.

Ich kann mir nur vorstellen, was Sie erreichen wollen, indem Sie Ihr eigenes Programm schreiben, um die erforderlichen tarHeader und ähnliches um Ihren Datenstrom hinzuzufügen . Dann könntest du schreiben:

$ bzcat foo.bz2 | stream-to-tar | bzip - > foo.tar.bz2 

... und (vorausgesetzt, Ihr Programm hat das tarrichtige Format), können Sie es mit einem Standard dekomprimieren tar xf foo.tar.bz2.


Dies ist wahrscheinlich nicht die Art und Weise, in der Sie es tun möchten, da es nicht die üblichen Vorteile des Tarierens der Datei bietet.

$ bzcat foo.bz2 | tar cjf foo.tar.bz2 - 

Nun, das Problem ist, dass tar kein Dateisystem enthält, da wir lediglich einen dekomprimierten Datenstrom haben. Das heißt, Sie müssen es wie folgt dekomprimieren / entpacken:

$ tar --to-stdout -xjf foo.tar.bz2 > foo 

welche Version von tar ist das? funktioniert nicht mit GNU tar 1.16.1. goldPseudo vor 14 Jahren 0
GNU tar 1.20 bei debian, 1.21 bei cygwin. hmm. du hast recht, der erste Befehl scheint nicht zu funktionieren. tar sez `tar: -: Stat kann nicht erstellt werden: Keine solche Datei oder Verzeichnis. es scheint STDIN nicht zu mögen. Der zweite Befehl würde funktionieren, vorausgesetzt, der erste Befehl wurde ausgeführt. quack quixote vor 14 Jahren 0
`tar` akzeptiert keinen Datenstrom von STDIN, es muss sich um eine Liste von Dateien handeln. matpie vor 14 Jahren 3
@sirlancelot: richtig, danke. Meine Antwort wurde korrigiert. quack quixote vor 14 Jahren 0
0
Jack M.

Ich denke, Sie werden feststellen, dass die Antwort lautet: Sie machen das nicht. Die Komprimierung einer .tbz2Datei gegenüber einer .bz2Datei ist ziemlich minimal, wenn Sie sie mit komprimieren --best. Hier ist ein Beispiel über ein httpd-Fehlerprotokoll:

 39M ./httpd-error.log 904K ./httpd-error.log.bz2 904K ./httpd-error.log.tbz2 

Andernfalls müssen Sie es mit einem Stopp an der Festplatte tun.

Ich habe es nicht für die Kompression gemacht. Ich habe es gemacht, weil eine .tar.bz2 ohne Dekomprimierung eingehängt werden kann, eine .bz2 jedoch nicht. Bei sehr großen komprimierten Dateien (OSM-Maps und Wikipedia-Dumps sind beispielsweise extrem große XML-Dateien, die beispielsweise als .bz2-Datei gespeichert sind), möchten Sie wirklich nicht die gesamte Sache auf Ihrem Laufwerk dekomprimieren, um sie verwenden zu können. endolith vor 14 Jahren 1
Dann müsste ich wohl wissen, was Sie mit dieser Datei machen wollen? Möchten Sie mit einer Programmiersprache analysieren, sie durchsuchen usw.? Jack M. vor 14 Jahren 0
Beides, ja. endolith vor 14 Jahren 0