curl .gz-Datei und leiten Sie sie zur Dekomprimierung weiter

curl .gz-Datei und leiten Sie sie zur Dekomprimierung weiter

.gzIch versuche, einige Dateien (NB, keine Einsen) von den angegebenen URLs herunterzuladen .tar.gzund sie zu dekomprimieren, um ggf. vorhandene Dateien zu überschreiben.

Für jeden einzelnen Download habe ich Folgendes versucht:

curl -O $URL | gunzip -f

Dies funktionierte jedoch nicht, da es mit Folgendem fehlschlug: gzip: stdin: unexpected end of fileIch habe eine Reihe dieser Befehle in einem Bash-Shell-Skript ausgeführt.

Wenn ich den Befehl in zwei explizite Schritte aufteile, also zuerst die Datei herunterlade und dann die .gzDatei dekomprimiere, funktioniert es.

Warum funktioniert die Pipe-Version nicht?

Antwort1

Eine Pipe (dargestellt durch das |Symbol) sendet dieStandardausgabeeines Prozesses zumStandardeingabeeines anderen. In Ihrem Fall scheinen Sie eine benannte Datei verwenden zu wollen, sodass eine Pipe nicht geeignet ist – insbesondere gibt es nichts zu pipen (daher der gunzipFehler), da die Remote-Inhalte in eine lokale Datei gehen. Stattdessen müssten Sie den Namen der Datei extrahieren – beispielsweise aus ihrer URL – etwa so (unter Verwendung der in Bash integrierten Funktionen zur Zeichenfolgenbearbeitung):

curl -O "$URL" && gunzip -f "${URL##*/}"

Wenn Sie eine Pipe verwenden möchten, dann wäre die Vorgehensweise etwa so:

curl "$URL" | gunzip -c

(ohne die -OOption), sodass curlder Remote-Inhalt dorthin gestreamt wird, stdoutvon wo aus er weitergeleitet werden kann gunzip. Dann müssten Sie die gunzipAusgabe jedoch umleiten, um die unkomprimierte Zieldatei entsprechend zu überschreiben.

Antwort2

Folgen Sie beim Herunterladen den Weiterleitungen. Manchmal hat ein Webserver aus Sicherheitsgründen und/oder aus zufälligen Gründen versteckte Weiterleitungen. Wenn Sie der Weiterleitung nicht folgen, werden die falschen Daten heruntergeladen und Ihre Anwendung, die die weitergeleiteten Daten liest, wird verwirrt. Sie können Weiterleitungen mit curl unter Verwendung des Flags -L folgen.

curl -L https://example.com/mygzip.tar.gz | tar zxv

Antwort3

Das Folgende bewirkt 3 Dinge

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. Erzwingen Sie die Erstellung des Zielverzeichnisses
  2. Entarchiviert das Archiv im angegebenen Verzeichnis
  3. Ersetzt das Stammverzeichnis durch den angegebenen Verzeichnisnamen, indem einfach das Stammverzeichnis des Archivs reduziert wird.

verwandte Informationen