Wie leite ich die Ausgabe von wget als Eingabe zum Entpacken um?

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 entspricht wget 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 ich bsdtar herunterlade und weiterleite, werden die Exec-Bits weggeworfen. Wenn ich mit bsdtar oder unzip 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ür unzip verwendet werden könnte; Leider stellt jar 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

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 -  

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.