Kann ich mit der Standardausgabe Entpacken oder ähnliche Programme ausführen? Die Situation ist, dass ich eine Zip-Datei herunterlade, die im laufenden Betrieb entpackt werden soll.
Zugehöriges Problem: Wie leite ich eine heruntergeladene Datei in bash an die Standardausgabe weiter?
linux
ubuntu
pipe
compression
Alex
quelle
quelle
Antworten:
Während eine zip-Datei tatsächlich ein Containerformat ist, gibt es keinen Grund, warum sie nicht aus einer Pipe (stdin) gelesen werden kann, wenn die Datei leicht genug in den Speicher passt. Hier ist ein Python-Skript, das eine Zip-Datei als Standardeingabe verwendet und den Inhalt in das aktuelle Verzeichnis oder in ein angegebenes Verzeichnis extrahiert, falls angegeben.
Dieses Skript kann auf eine Zeile verkleinert und als Alias erstellt werden.
Jetzt entpacke die Ausgabe von wget ganz einfach.
quelle
.read()
MethodeEs ist unwahrscheinlich, dass dies so funktioniert, wie Sie es erwarten. Zip ist nicht nur ein Komprimierungsformat, sondern auch ein Containerformat. Es fasst die Jobs von tar und gzip.bzip2 zu einem zusammen. Wenn Ihre Zip-Datei jedoch nur eine einzige enthält, können Sie mit unzip -p die Dateien nach stdout extrahieren. Wenn Sie mehr als eine Datei haben, können Sie nicht feststellen, wo sie beginnen und enden.
Was das Lesen von stdin betrifft, enthält die Manpage zum Entpacken diesen Satz:
Vielleicht hast du etwas Glück mit Funzip.
quelle
Sie möchten, dass
unzip
eine ZIP-Datei nicht als Argument, sondern als Standardeingabe verwendet wird. Dies ist in der Regel leicht gestützt durchgzip
undtar
Art von Werkzeugen mit einem-
Argument. Der Standardunzip
tut dies jedoch nicht (unterstützt jedoch die Extraktion in ein Rohr). Es ist jedoch nicht alles verloren ...Schauen Sie sich die Funzip- Handbuchseite an.
Dies passt gut zu der Vorstellung, dass die meisten Linux-Archive normalerweise TAR'ed und dann in gewisser Weise ZIPped sind (gzip, bzip, et al.). Dies funktioniert für Sie, wenn Sie eine haben
tar.ZIP
.Es ist erwähnenswert, dass
funzip
von Info-ZIP-Originalautor Mark Adler geschrieben. Er schreibt in der Funzip-Manpage:Es wird jedoch kein solches Update angezeigt. Ich vermute, dass Mark dies für unnötig hielt, da andere Archivierungsmethoden mit TAR problemlos funktionierten.
quelle
Ich verwende gerne curl, da es standardmäßig installiert ist (das
-L
wird für häufig auftretende Weiterleitungen benötigt):Ist
bsdtar
jedoch nicht standardmäßig installiert und ich konnte nichtfunzip
an die Arbeit gehen.quelle
Dies ist eine Wiederholung meiner Antwort auf eine ähnliche Frage:
Das ZIP-Dateiformat enthält ein Verzeichnis (Index) am Ende des Archivs. In diesem Verzeichnis steht, wo sich innerhalb des Archivs jede Datei befindet und ermöglicht so einen schnellen, zufälligen Zugriff, ohne das gesamte Archiv zu lesen.
Dies scheint ein Problem zu sein, wenn versucht wird, ein ZIP-Archiv über eine Pipe zu lesen, da auf den Index erst ganz am Ende zugegriffen wird und daher einzelne Mitglieder erst dann korrekt extrahiert werden können, wenn die Datei vollständig gelesen wurde und nicht mehr verfügbar ist . Als solches erscheint es nicht überraschend, dass die meisten ZIP-Dekomprimierer einfach versagen, wenn das Archiv über eine Pipe geliefert wird.
Das Verzeichnis am Ende des Archivs ist nicht der einzige Ort, an dem Datei-Metainformationen im Archiv gespeichert werden. Darüber hinaus enthalten einzelne Einträge diese Informationen aus Redundanzgründen auch in einem lokalen Dateikopf.
Obwohl nicht jeder ZIP-Dekomprimierer lokale Dateiheader verwendet, wenn der Index nicht verfügbar ist, können und werden die Frontends tar und cpio für libarchive (auch bekannt als bsdtar und bsdcpio) beim Durchlesen einer Pipe verwendet. Dies bedeutet, dass Folgendes möglich ist:
quelle
Mit Info-Zip, der am häufigsten verwendeten OSS-Implementierung, ist dies nicht möglich. Noch wichtiger ist jedoch, dass dies aufgrund der Konstrukte von ZIP-Archiven nicht empfohlen wird.
Wenn Sie das Format ändern können, sollten Sie stattdessen tar (1) verwenden. Es ist ziemlich zufrieden mit der gestreamten Eingabe / Ausgabe und erwartet diese standardmäßig.
Außerdem können Sie häufig feststellen, ob Anwendungen gestreamte Ein- / Ausgaben erwarten, indem Sie "-" für einen Dateinamen angeben. Wie Sie sich vorstellen können, behandelt Info-Zip dies nicht als gültiges Argument.
quelle
In zsh können Sie Folgendes tun:
quelle
Das einfachste gängige Dienstprogramm, das hierfür zur Verfügung steht
jar
, setzt voraus, dass STDIN verwendet wird, wenn Sie keine Datei-Argumente übergeben. Es werden auch Argumente verwendet, die demtar
Programm für Operationen ähneln .zB den Inhalt eines Archivs auflisten
curl https://my.example.com/file.zip | jar t
Java ist zwar nicht immer installiert, aber auf den Rechnern, auf denen es installiert ist,
jar
ist dies definitiv die bequemste Methode.quelle
Repost meiner Antwort :
BusyBox's
unzip
können stdin nehmen und alle Dateien extrahieren.Der Bindestrich danach
unzip
ist stdin als Eingabe zu verwenden.Du kannst sogar,
Aber das ist einfach überflüssig
unzip file.zip
.Wenn Ihre Distribution standardmäßig BusyBox verwendet (z. B. Alpine), starten Sie einfach
unzip -
.quelle
Eigentlich brauchte ich etwas komplexeres - extrahiere eine bestimmte Datei, wenn sie existiert. Die Schwierigkeit besteht darin, dass der Eingabedateistream möglicherweise keine Zip-Datei ist. In diesem Fall musste er über die Pipe fortgesetzt werden. Hier ist meine Lösung (hauptsächlich dank Jason R. Coombs Lösung)
Ich habe dies als Datei mit dem Namen "effpoptp" (kein einfacher Name) im Ordner "/ bin" auf meinem Computer gespeichert.
Der Zweck ist die Versionskontrolle von MySQL Workbench-Dateien, wobei die Datei die XML-Datei sein kann, die als Workbench-Datei bezeichnet wird, oder die vollständige Workbench-Datei.
quelle