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?

skyork
la source
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.

tournevis
la source
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
Jam Risser
la source