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?


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.