Locken Sie die .gz-Datei und leiten Sie sie zur Dekomprimierung weiter

13

Ich versuche, einige .gzDateien (NB keine .tar.gz) von angegebenen URLs herunterzuladen und zu dekomprimieren, um eventuell vorhandene Dateien zu überschreiben.

Für jeden einzelnen Download habe ich Folgendes versucht:

curl -O $URL | gunzip -f

Dies führte jedoch nicht, wie es mit fehlgeschlagen: gzip: stdin: unexpected end of file. Ich habe eine Reihe dieses Befehls in einem Bash-Shell-Skript ausgeführt.

Wenn ich den Befehl in zwei explizite Schritte unterteilt habe, dh zuerst die Datei heruntergeladen und dann die .gzDatei dekomprimiert habe , funktioniert es.

Warum funktioniert die Pipe-Version nicht?

skyork
quelle
1
Sind Sie sicher, dass curl -Odie Datei tatsächlich zur Standardausgabe gestreamt wird? Vielleicht denkst du an wget -O-?
Steeldriver
@steeldriver du solltest das als Antwort posten curl | tar xz ...
Panther
Es gibt auch --compressed, aber das funktioniert nur für komprimierte Antworten.
Kenorb

Antworten:

18

Eine Pipe (dargestellt durch das |Symbol) sendet die Standardausgabe eines Prozesses an die Standardeingabe eines anderen. In Ihrem Fall möchten Sie anscheinend eine benannte Datei verwenden, sodass eine Pipe nicht geeignet ist. Insbesondere gibt es keine Pipe (daher der gunzipFehler), da der Remote-Inhalt in eine lokale Datei verschoben wird. Stattdessen müssten Sie den Namen der Datei extrahieren - beispielsweise aus der URL - wie in etwa (mithilfe der in bash integrierten Funktionen zur Manipulation von Zeichenfolgen).

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

Wenn Sie eine Pipe verwenden möchten, wäre der Weg, dies zu tun, ungefähr so

curl "$URL" | gunzip -c

(ohne die -OOption), sodass curlder Remote-Inhalt an stdoutdie Stelle gestreamt wird gunzip, an die er weitergeleitet werden kann. Anschließend müssen Sie die gunzipAusgabe umleiten, um die nicht komprimierte Zieldatei entsprechend zu überschreiben.

Stahlfahrer
quelle
5

Folgen Sie beim Herunterladen den Weiterleitungen. Manchmal hat ein Webserver aus Sicherheits- und / oder zufälligen Gründen versteckte Weiterleitungen. Wenn Sie der Umleitung nicht folgen, werden die falschen Daten heruntergeladen und Ihre Anwendung, die die weitergeleiteten Daten liest, wird verwirrt. Mit dem Flag -L können Sie Umleitungen mit Locken folgen.

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