J'essaie de télécharger certains .gz
fichiers (NB pas .tar.gz
ceux) à 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 .gz
fichier, cela fonctionne.
Pourquoi la version canalisée ne fonctionne pas?
curl -O
le fichier est diffusé en sortie standard? Vous pensez peut-êtrewget -O-
?--compressed
, mais cela ne fonctionne que pour une réponse compressée.Réponses:
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'gunzip
erreur) 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)Si vous voulez utiliser un tuyau, alors la façon de le faire serait quelque chose comme
(sans l'
-O
option) afin quecurl
le contenu distant soit diffusé àstdout
partir duquel il peut être canaliségunzip
, mais vous devrez alors rediriger lagunzip
sortie pour écraser le fichier non compressé cible, le cas échéant.la source
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.
la source