Lassen Sie tar den Komprimierungstyp beim Extrahieren aus stdin automatisch erkennen

16

Ich benutze GNU Teer. Es kann den Komprimierungstyp beim Komprimieren / Dekomprimieren von Dateien automatisch erkennen. Aber ich muss ein Archiv von stdin dekomprimieren und der Komprimierungstyp ist unbekannt. Mir ist aufgefallen, dass Teer mir richtige Vorschläge geben kann, wie:

tar: Archive is compressed. Use -z option

Aber ich möchte, dass tar diese Komprimierungsoption automatisch verwendet, ohne mich zu bitten, dieses Argument einzugeben. Wie kann ich das machen? Warum nicht einfach tar dekomprimieren, da es den Komprimierungstyp bereits kennt?

Vielen Dank!

James
quelle
Es war nicht schwer sich zu entwickeln, aber es wird bis jetzt nicht gemacht.
peterh
3
Der Grund, warum dies nicht möglich ist, tarbesteht darin, dass stdinerst nach dem Lesen bekannt ist, über welche Art von Daten sie verfügen. Bis dahin ist es zu spät, das Dekomprimierungsprogramm aufzurufen. Es unterstützt gzip, bzip2 und andere. Es ist nicht einfach, dieses Problem zu umgehen (die Daten müssten gepuffert werden). Sie müssen es also nur noch einmal versuchen.
Kevin Panko
@ KevinPanko Warum wo es zu spät ist? Nein, es ist nicht spät. Er liest zB die ersten 4K in einem Puffer, testet den Komprimierungstyp (falls vorhanden) und ruft dann das Programm auf. Diese Pufferung bestand aus 10-20 Zeilen zusätzlichen C-Codes.
peterh - Wiedereinsetzung von Monica
2
Zu dem Zeitpunkt, zu dem es weiß, über welche Daten es verfügt, kann es keine simple fork()/ exec()-Methode mehr verwenden , um die Daten durch ein Dekomprimierungsdienstprogramm zu leiten. Das Dienstprogramm würde aus der stdinPipe lesen und die ersten 4 KB würden jetzt fehlen. Es gibt keine Möglichkeit, die Daten nach dem Lesen wieder in die Pipe einzufügen.
Kevin Panko
3
@KevinPanko: Es könnte jedoch durch Verzweigen von zwei Prozessen geschehen, die im Grunde genommen das Äquivalent von tun cat buffer - | gunzip. (Alternativ können nicht blockierende E / A verwendet werden, um die Notwendigkeit eines zusätzlichen Prozesses zu vermeiden.)
Ilmari Karonen,

Antworten:

10

Dies ist nicht die Antwort, die Sie hören möchten, aber dies wird von GNU tar gemäß seinem Handbuch nicht unterstützt:

Der einzige Fall, in dem Sie beim Lesen des Archivs eine Dekomprimierungsoption angeben müssen, ist das Lesen von einer Pipe oder einem Bandlaufwerk, das keinen Direktzugriff unterstützt. In diesem Fall gibt GNU tar jedoch an, welche Option Sie verwenden sollten. Beispielsweise:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

Wenn Sie eine solche Diagnose sehen, fügen Sie einfach die vorgeschlagene Option zum Aufruf von GNU tar hinzu:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Komprimierte Archive erstellen und lesen

Kevin Panko
quelle
2
Beachten Sie, dass dies unter OSX im Befehl tar funktioniert, unter Linux jedoch nicht unter GNU tar. Das könnte also behoben werden.
Sean Perry
8

Schließlich wurde mir klar, dass ich das Archiv von stdin nicht von tar erkennen und dekomprimieren lassen kann, weil ich GNU tar verwende. BSD-Teer kann dies ohne Probleme automatisch tun. Deshalb entscheide ich mich, jetzt in meinem Skript bsdtar anstelle von tar zu verwenden.

James
quelle