J'essaie de télécharger des fichiers .gz
(N.B. et non .tar.gz
) à partir d'URL données et de les décompresser pour écraser les fichiers existants, le cas échéant.
Pour chaque téléchargement individuel, j'ai essayé les solutions suivantes:
curl -O $URL | gunzip -f
Cependant, cela n'a pas fonctionné car il a échoué avec: gzip: stdin: unexpected end of file
. J'ai couru une série de cette commande dans un script bash shell.
Si j’ai renversé la commande en deux étapes explicites, c’est-à-dire que je commence par télécharger le fichier, puis que je décompresse le fichier .gz
, cela fonctionne.
Pourquoi la version canalisée ne fonctionne pas?
Un canal (représenté par le symbole |
) envoie le sortie standard d'un processus au entrée standard d'un autre. Dans votre cas, vous semblez vouloir utiliser un fichier nommé, un canal n'est donc pas approprié. En particulier, il n'y a rien à canaliser (d'où l'erreur gunzip
) car le contenu distant est dirigé vers un fichier local. Au lieu de cela, vous devrez extraire le nom du fichier - par exemple de son URL - par exemple (en utilisant les capacités de manipulation de chaînes intégrées de bash)
curl -O "$URL" && gunzip -f "${URL##*/}"
Si vous voulez utiliser un tuyau, la façon de le faire serait quelque chose comme:
curl "$URL" | gunzip -c
(sans l'option -O
) afin que curl
diffuse le contenu distant vers stdout
d'où il peut être redirigé vers gunzip
, mais vous devrez alors rediriger la sortie gunzip
pour écraser le fichier non compressé cible, le cas échéant.
Suivez les redirections lors du téléchargement. Parfois, un serveur Web a masqué les redirections pour des raisons de sécurité et/ou aléatoires. Si vous ne suivez pas la redirection, les données erronées sont téléchargées et votre application qui lit les données acheminées devient confuse. Vous pouvez suivre les redirections avec curl en utilisant l'indicateur -L.
curl -L https://example.com/mygzip.tar.gz | tar zxv