Próbuję pobrać niektóre .gz
pliki (NB nie .tar.gz
te) z podanych adresów URL i rozpakować je, aby zastąpić istniejące pliki, jeśli takie istnieją.
Dla każdego pojedynczego pobrania próbowałem:
curl -O $URL | gunzip -f
Jednak to nie działa, ponieważ nie powiodło się: gzip: stdin: unexpected end of file
. Uruchomiłem serię tego polecenia w skrypcie powłoki bash.
Jeśli rozłożyłem polecenie na dwa wyraźne kroki, tj. Najpierw pobierz plik, a następnie rozpakuj .gz
plik, to działa.
Dlaczego wersja potokowa nie działa?
curl -O
plik jest przesyłany strumieniowo na standardowe wyjście? Być może myśliszwget -O-
?--compressed
, ale działa to tylko w przypadku skompresowanych odpowiedzi.Odpowiedzi:
Potok (reprezentowany przez
|
symbol) wysyła standardowe wyjście jednego procesu do standardowego wejścia innego. W twoim przypadku wydaje się, że chcesz użyć nazwanego pliku, więc potok jest nieodpowiedni - w szczególności nie ma nic do potoku (stądgunzip
błąd), ponieważ zdalna zawartość trafi do pliku lokalnego. Zamiast tego musisz wyodrębnić nazwę pliku - na przykład z jego adresu URL - coś podobnego (używając wbudowanych funkcji bash do manipulacji ciągami)Jeśli chcesz użyć fajki, to sposób na zrobienie tego byłby podobny
(bez
-O
opcji), abycurl
przesyłać strumieniowo zdalną zawartość do miejsca,stdout
z którego można ją wpakowaćgunzip
, ale wtedy trzeba przekierować danegunzip
wyjściowe, aby odpowiednio zastąpić docelowy nieskompresowany plik.źródło
Podczas pobierania postępuj zgodnie z przekierowaniami. Czasami serwer sieciowy ukrył przekierowania ze względów bezpieczeństwa i / lub losowych. Jeśli nie zastosujesz się do przekierowania, nieprawidłowe dane zostaną pobrane, a twoja aplikacja odczytująca dane przesyłane w potoku zostanie pomylona. Możesz śledzić przekierowania za pomocą curl używając flagi -L.
źródło