Ich muss eine Datei von diesem Link herunterladen . Der Dateidownload ist eine Zip-Datei, die ich im aktuellen Ordner entpacken muss.
Normalerweise würde ich es zuerst herunterladen und dann den Befehl zum Entpacken ausführen.
$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
$ unzip temp.zip
Aber auf diese Weise muss ich zwei Befehle ausführen, auf den Abschluss des ersten warten, um den nächsten auszuführen. Außerdem muss ich den Namen der Datei kennen temp.zip
, der es geben soll unzip
.
Ist es möglich, die Ausgabe von wget
nach umzuleiten unzip
? So etwas wie
$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`
Aber es hat nicht funktioniert.
Bash::
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
Mehrdeutige Weiterleitung
Auch wget
wurde ausgeführt zweimal, und die Datei heruntergeladen zweimal.
command-line
io-redirection
Andrew-Dufresne
quelle
quelle
Antworten:
Sie müssen Ihre Dateien in eine temporäre Datei herunterladen, da (unter Angabe der Manpage zum Entpacken):
Bringen Sie einfach die Befehle zusammen:
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip; unzip temp.zip; rm temp.zip
Aber um es flexibler zu machen, sollten Sie es wahrscheinlich in ein Skript einfügen, damit Sie etwas Tipparbeit sparen und um sicherzustellen, dass Sie nicht versehentlich etwas überschreiben, können Sie den
mktemp
Befehl verwenden, um einen sicheren Dateinamen für Ihre temporäre Datei zu erstellen:quelle
wget file.zip && unzip file.zip
das gleichwget file.zip; unzip file.zip
oder wird das eine dem anderen vorgezogen? Danke :)wget && unzip
wird nur dann entpackt, wenn wget erfolgreich war.wget ; unzip
wird trotzdem entpackt und zeigt möglicherweise auf eine nicht existierende Datei.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 erst ganz am Ende auf den Index 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
.zip
-Datei hier, die Dateien mit ausführbaren Berechtigungen enthält. Beim Herunterladen und Pipe-Inbsdtar
werden die Exec-Bits weggeworfen. Wenn ich auf die Festplatte herunterlade und mitbsdtar
oder extrahiereunzip
, werden die Exec-Bits berücksichtigt.bsdtar
geöffnet wird, kann gesucht werden, oder nicht, wird der eine oder andere Speicherort verwendet.Wenn Sie das JDK installiert haben, können Sie Folgendes verwenden
jar
:quelle
jar
die Dateiberechtigungen nicht erhalten bleiben. Sonst netter Trick.| jar xv
Ich glaube nicht, dass Sie sich die Mühe machen wollen, die Ausgabe von wget in unzip zu leiten.
Aus dem Wikipedia- Artikel "ZIP (Dateiformat)" :
wget muss den Download vollständig abschließen, bevor unzip irgendwelche Arbeiten ausführen kann. Daher werden sie nacheinander ausgeführt und nicht miteinander verwoben, wie man denkt.
quelle
Die richtige Syntax wäre:
aber es wird nicht funktionieren, wegen des Fehlers ( Info-ZIP unter Debian ):
oder unter BSD / OS X:
Dies liegt daran, dass die Standard-Zip-Tools hauptsächlich
lseek
Funktionen verwenden, um den Datei-Offset am Ende so einzustellen, dass das Ende des zentralen Verzeichnisdatensatzes gelesen wird . Sie befindet sich am Ende der Archivstruktur und muss die Liste der Dateien lesen (siehe: Zip-Dateiformatstruktur ). Daher kann die Datei kein FIFO, keine Pipe, kein Endgerät oder eine andere Dynamik sein, da das Eingabeobjekt von derlseek
Funktion nicht positioniert werden kann.Sie haben also die folgenden Problemumgehungen:
tar.gz
),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
Das funktioniert bei mir ganz gut:
quelle