Ich versuche, einige .gz
Dateien (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 .gz
Datei dekomprimiert habe , funktioniert es.
Warum funktioniert die Pipe-Version nicht?
curl -O
die Datei tatsächlich zur Standardausgabe gestreamt wird? Vielleicht denkst du anwget -O-
?--compressed
, aber das funktioniert nur für komprimierte Antworten.Antworten:
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 dergunzip
Fehler), 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).Wenn Sie eine Pipe verwenden möchten, wäre der Weg, dies zu tun, ungefähr so
(ohne die
-O
Option), sodasscurl
der Remote-Inhalt anstdout
die Stelle gestreamt wirdgunzip
, an die er weitergeleitet werden kann. Anschließend müssen Sie diegunzip
Ausgabe umleiten, um die nicht komprimierte Zieldatei entsprechend zu überschreiben.quelle
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.
quelle