curl .gz file et le canaliser pour la décompression


13

J'essaie de télécharger certains .gzfichiers (NB pas .tar.gzceux) à partir des URL données et de les décompresser pour remplacer les fichiers existants, le cas échéant.

Pour chaque téléchargement individuel, j'ai essayé ce qui suit:

curl -O $URL | gunzip -f

Cependant, cela ne fonctionne pas comme il a échoué avec: gzip: stdin: unexpected end of file. J'ai exécuté une série de cette commande dans un script shell bash.

Si j'ai renversé la commande en deux étapes explicites, c'est-à-dire d'abord télécharger le fichier, puis décompresser le .gzfichier, cela fonctionne.

Pourquoi la version canalisée ne fonctionne pas?


1
Êtes-vous sûr que curl -Ole fichier est diffusé en sortie standard? Vous pensez peut-être wget -O-?
Steeldriver

@steeldriver vous devez poster cela comme une réponse curl | tar xz ...
Panther

Il y en a aussi --compressed, mais cela ne fonctionne que pour une réponse compressée.
kenorb

Réponses:


18

Un tuyau (représenté par le |symbole) envoie la sortie standard d'un processus à l' entrée standard d'un autre. Dans votre cas, vous semblez vouloir utiliser un fichier nommé afin qu'un canal ne soit pas approprié - en particulier, il n'y a rien à diriger (d'où l' gunziperreur) car le contenu distant va dans un fichier local. Au lieu de cela, vous devez extraire le nom du fichier - par exemple, de son URL - quelque chose comme (en utilisant les capacités intégrées de manipulation de chaînes de bash)

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

Si vous voulez utiliser un tuyau, alors la façon de le faire serait quelque chose comme

curl "$URL" | gunzip -c

(sans l' -Ooption) afin que curlle contenu distant soit diffusé à stdoutpartir duquel il peut être canalisé gunzip, mais vous devrez alors rediriger la gunzipsortie pour écraser le fichier non compressé cible, le cas échéant.


6

Suivez les redirections lors du téléchargement. Parfois, un serveur Web a des redirections cachées pour des raisons de sécurité et / ou aléatoires. Si vous ne suivez pas la redirection, les données incorrectes sont téléchargées et votre application lisant les données transmises est confuse. Vous pouvez suivre les redirections avec curl en utilisant l'indicateur -L.

curl -L https://example.com/mygzip.tar.gz | tar zxv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.