zwiń plik .gz i potokuj go w celu dekompresji

13

Próbuję pobrać niektóre .gzpliki (NB nie .tar.gzte) 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 .gzplik, to działa.

Dlaczego wersja potokowa nie działa?

niebo
źródło
1
Czy na pewno curl -Oplik jest przesyłany strumieniowo na standardowe wyjście? Być może myślisz wget -O-?
steeldriver
@steeldriver powinieneś zamieścić to jako curl odpowiedzi tar xz ...
Panther
Jest też --compressed, ale działa to tylko w przypadku skompresowanych odpowiedzi.
kenorb

Odpowiedzi:

18

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ąd gunzipbłą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)

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

Jeśli chcesz użyć fajki, to sposób na zrobienie tego byłby podobny

curl "$URL" | gunzip -c

(bez -Oopcji), aby curlprzesyłać strumieniowo zdalną zawartość do miejsca, stdoutz którego można ją wpakować gunzip, ale wtedy trzeba przekierować dane gunzipwyjściowe, aby odpowiednio zastąpić docelowy nieskompresowany plik.

steeldriver
źródło
6

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.

curl -L https://example.com/mygzip.tar.gz | tar zxv
Jam Risser
źródło