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 sie 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 und auf den Abschluss des ersten warten, um den nächsten auszuführen. Außerdem muss ich den Namen der Datei kennen. temp.zip
, um es unzip
zu geben.
Ist es möglich, die Ausgabe von wget
nach 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
Außerdem wurde wget
zweimal ausgeführt und die Datei zweimal heruntergeladen.
Kommentare
- Im letzteren Beispiel wurde wget wahrscheinlich zweimal ausgeführt, da das? ein Sonderzeichen in der Shell ist Das Einfügen der URL in “ “ sollte helfen.
- Dieser Thread scheint eine Lösung zu haben. Haven ‚ habe es jedoch nicht selbst versucht. serverfault.com/questions/26474/…
Antwort
Sie müssen Ihre Dateien in eine temporäre Datei herunterladen, weil (unter Angabe des Entpackens) Manpage):
Von Standardeingaben gelesene Archive werden noch nicht unterstützt, außer mit funzip (und dann nur dem ersten m Die Glut des Archivs kann extrahiert werden.
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
Um es jedoch flexibler zu gestalten, sollten Sie es wahrscheinlich in ein Skript einfügen, damit Sie einige Eingaben sparen. Um sicherzustellen, dass Sie nicht versehentlich etwas überschreiben, können Sie die mktemp
zum Erstellen eines sicheren Dateinamens für Ihre temporäre Datei:
#!/bin/bash TMPFILE=`mktemp` PWD=`pwd` wget "$1" -O $TMPFILE unzip -d $PWD $TMPFILE rm $TMPFILE
Kommentare
- Is
wget file.zip && unzip file.zip
entsprichtwget file.zip; unzip file.zip
oder wird einer dem anderen vorgezogen? Danke 🙂 - @NextLocal
wget && unzip
wird nur dann entpackt, wenn wget erfolgreich war.wget ; unzip
wird ohnehin entpackt ausgeführt und zeigt möglicherweise auf eine nicht vorhandene Datei. - funzip war die Antwort, nach der ich gesucht habe. Terraform verpackt (aus irgendeinem Grund) die Binärdatei ‚ als einzelne Datei in einem Zip-Archiv, sodass dies perfekt für mich war.
Antwort
Dies ist ein Repost von meiner Antwort auf eine ähnliche Frage:
Das ZIP-Dateiformat enthält ein Verzeichnis (Index) am Ende des Archivs. In diesem Verzeichnis wird angegeben, wo sich innerhalb des Archivs jede Datei befindet, und somit ein schneller, zufälliger Zugriff ermöglicht, ohne das gesamte Archiv zu lesen.
Dies scheint ein Problem zu sein, wenn versucht wird, ein ZIP-Archiv über a zu lesen Pipe, da auf den Index erst am Ende zugegriffen wird und einzelne Mitglieder erst dann korrekt extrahiert werden können, wenn die Datei vollständig gelesen wurde und nicht mehr verfügbar ist. Daher ist es nicht überraschend, dass die meisten ZIP-Dekomprimierer einfach fehlschlagen, wenn das Archiv über eine Pipe bereitgestellt wird.
Das Verzeichnis am Ende des Archivs ist nicht der einzige Speicherort für Datei-Meta Informationen werden im Archiv gespeichert. Darüber hinaus enthalten einzelne Einträge diese Informationen aus Redundanzgründen auch in einem lokalen Dateikopf.
Obwohl nicht jeder ZIP-Dekomprimierer lokale Datei-Header verwendet, wenn der Index nicht verfügbar ist, können und werden die Frontends von tar und cpio für libarchive (auch bekannt als bsdtar und bsdcpio) dies tun, wenn Lesen durch eine Pipe, was bedeutet, dass Folgendes möglich ist:
wget -qO- http://example.org/file.zip | bsdtar -xvf-
Kommentare
- Dies ist ausgezeichnet ! Ich würde bemerken, dass tar mir einige Warnungen gibt, dass die unkomprimierten Daten die falsche Größe haben (erwartete 0), aber die Dateien selbst scheinen unbeschädigt zu sein. Vermutlich liegt dies am Fehlen des Index.
- Ich habe hier eine
.zip
-Datei, die Dateien mit ausführbaren Berechtigungen enthält. Wenn ichbsdtar
herunterlade und weiterleite, werden die Exec-Bits weggeworfen. Wenn ich mitbsdtar
oderunzip
auf die Festplatte herunterlade und extrahiere, werden die Exec-Bits berücksichtigt. - // , @GolarRamblar, haben Sie nie herausgefunden, warum?
- @NathanBasanese: hier ist die Antwort. Kurz gesagt: Ein ZIP-Archiv hat zwei Stellen, an denen solche Informationen gespeichert werden, die inkonsistent sein können. Je nachdem, ob die geöffnete Datei
bsdtar
durchsucht werden kann oder nicht, wird die eine oder andere Stelle verwendet .
Antwort
Wenn Sie das JDK installiert haben, können Sie jar
:
wget -qO- http://example.org/file.zip | jar xvf /dev/stdin
Kommentare
- Ich habe gerade festgestellt, dass
jar
‚ behält die Dateiberechtigungen nicht bei. Ansonsten ein netter Trick. - Sie ‚ müssen keinen Dateiparameter angeben, verwenden Sie einfach
| jar xv
- Auch ich wurde von der Annahme gebissen, dass
jar
als Ersatz fürunzip
verwendet werden könnte; Leider stelltjar
extrahierte Dateien nicht wieder her ‚ Berechtigungen; - Verwenden Sie einfach
| jar x
-
jar
ist viel besser im Umgang mit UTF-8-Dateinamen.unzip
verstümmelte Dinge.
Antwort
Ich tue es nicht Ich denke, Sie möchten sich sogar die Mühe machen, die Ausgabe von wget in unzip zu leiten.
Aus der Wikipedia „ZIP (Dateiformat)“ Artikel:
Eine ZIP-Datei wird durch das Vorhandensein eines zentralen Verzeichnisses am Ende der Datei identifiziert.
wget muss den Download vollständig beenden, bevor das Entpacken ausgeführt werden kann. Daher werden sie nacheinander ausgeführt und nicht wie gedacht miteinander verwoben.
Antwort
Repost von meiner Antwort :
BusyBox „s unzip
kann stdin nehmen und alle Dateien extrahieren.
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -
Der Bindestrich nach unzip
verwendet stdin als Eingabe.
Sie können sogar
cat file.zip | busybox unzip -
Aber das ist nur redundant von unzip file.zip
.
Wenn Ihre Distribution BusyBo verwendet x standardmäßig (z. Alpine), führen Sie einfach unzip -
aus.
Kommentare
- weiter zu @Saftever ‚ s Antwort, die ich ‚ nicht kommentieren darf, Busybox funktioniert, aber Versionen älter als 1.27.0 haben ‚ t aufgrund einer redundanten Suche, siehe Änderungsprotokoll Busybox.net
Antwort
Die richtige Syntax wäre:
$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip)
, aber es funktioniert aufgrund des Fehlers nicht ( Info-ZIP unter Debian ):
lseek(3, 0, SEEK_SET) = -1 ESPIPE (Illegal seek) Archive: /dev/fd/63 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of /dev/fd/63 or /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period.
oder unter BSD / OS X:
Trying to read large file (> 2 GiB) without large file support
Dies liegt daran, dass die Standard-Zip-Tools hauptsächlich lseek
Funktion , um den Datei-Offset am Ende so einzustellen, dass das Ende des zentralen Verzeichnisdatensatzes gelesen wird. Er befindet sich am Ende der Archivstruktur und muss die Liste lesen der Dateien (siehe: Zip-Dateiformatstruktur ). Daher kann die Datei kein FIFO, Pipe, Endgerät oder eine andere Dynamik sein, da das Eingabeobjekt nicht mit der Funktion lseek
positioniert werden kann.
Sie haben also die Folgende Problemumgehungen:
- Verwenden Sie eine andere Art der Komprimierung (z. B.
tar.gz
). - Sie müssen zwei separate Befehle verwenden,
- Verwenden Sie alternative Tools (wie in anderen Antworten vorgeschlagen).
- Erstellen Sie einen Alias oder eine Funktion, um mehrere Befehle zu verwenden.
Kommentare
- Ich denke, es könnte immer noch ein FIFO sein. Sie ‚ müssen nur bis zum EOF vom FIFO lesen (wodurch das gesamte FIFO im Speicher oder in einer temporären Datei effektiv gepuffert wird). Völlig machbar, um die Skripterstellung zu vereinfachen, aber nicht sehr nützlich.
Antwort
Wenn nur eine Datei vorhanden ist zip können Sie zcat
oder gunzip
verwenden:
wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip
Zu Ihrer Information: Hier sind die Definitionen von gunzip
und zcat
auf meinem System:
$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@"
Antwort
Ein zip
Archiv ist nicht sequentiell, da es häufig das Inhaltsverzeichnis enthält Am Ende der Datei ist es daher schwierig, sie per Stream zu entpacken.
Eine alternative Lösung besteht darin, zu prüfen, ob Sie ein anderes Dateiformat erhalten können, z. B. .tar.gz
.
Wenn Sie beispielsweise eine .zip
-Datei von GitHub herunterladen, gibt es fast immer eine .tar.gz
Version verfügbar.
Zum Beispiel
- https://github.com/madler/zlib/archive/v1.2.11.zip
- https://github.com/madler/zlib/archive/v1.2.11.tar.gz
- https://github.com/curl/curl/archive/curl-7_68_0.zip
- https://github.com/curl/curl/archive/curl-7_68_0.tar.gz
Beachten Sie das Muster – ersetzen Sie einfach .zip
durch .tar.gz
und leiten Sie an | tar xzf -
Antwort
Das funktioniert bei mir ganz gut:
tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf - wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -