Comment wget un fichier avec le nom correct quand redirigé?

117

Ainsi, après un certain temps de recherche sur Google et sur le super utilisateur (et le balayage des pages de manuel), je suis incapable de trouver une réponse à quelque chose qui (je pense) devrait être simple:

Si vous allez ici:

http://www.vim.org/scripts/script.php?script_id=2340

Et essayez de télécharger le thème:

http://www.vim.org/scripts/download_script.php?src_id=9750

Ainsi:

wget http://www.vim.org/scripts/download_script.php?src_id=9750

Vous allez probablement vous retrouver avec un fichier appelé download_script.php?src_id=9750.

Mais je veux qu’il soit appelé molokai.vim, ce qui se produirait si j’utilisais un navigateur pour télécharger ce fichier.

Quelles options dois-je spécifier pour wget pour l'effet souhaité?

Je serais également d'accord avec une commande équivalente Curl.

audio.zoom
la source

Réponses:

162
-O file
--output-document=file

Les documents ne seront pas écrits dans les fichiers appropriés, mais tous seront concaténés et écrits dans un fichier. Si -est utilisé comme fichier, les documents seront imprimés sur la sortie standard, désactivant la conversion de lien. (Utilisez ./-pour imprimer dans un fichier nommé littéralement -.)

Alors,

wget -O somefile.extension http://www.vim.org/scripts/download_script.php?src_id=9750

Ou vous pourrez peut-être wgetrésoudre ce problème en utilisant l'option --content-disposition si elle est supportée par votre version.

wget --content-disposition http://www.vim.org/scripts/download_script.php?src_id=9750

Mises en garde selon la page de manuel,

--content-disposition

Si cette option est activée, la prise en charge expérimentale (non entièrement fonctionnelle) des en-têtes "Content-Disposition" est activée. Cela peut actuellement entraîner des allers-retours supplémentaires sur le serveur pour une requête "HEAD", et souffre de quelques bogues. C'est pourquoi il n'est pas activé par défaut à l'heure actuelle.

Cette option est utile pour certains programmes CGI de téléchargement de fichiers utilisant les en-têtes "Content-Disposition" pour décrire le nom du fichier téléchargé.

Vous pouvez obtenir le même comportement automatisé avec curl, en utilisant,

curl -JLO http://www.vim.org/scripts/download_script.php?src_id=9750

-Outilise le nom distant et -Jforce le -Oà obtenir ce nom à partir de l'en-tête content-disposition plutôt que de l'URL, et -Lsuit les redirections si nécessaire.

EightBitTony
la source
2
J'aurais dû préciser que cela doit être automatique
audio.zoom
Si j'ai bien compris, wget se fie à la page Web pour l'informer correctement si l'URL pointe vers un fichier et qu'il doit être enregistré avec quelque chose de différent, à l'aide de l'en-tête de disposition du contenu, que wget peut ou ne prend pas totalement en charge. Donc, vous ne pouvez pas le faire automatiquement avec wget. Curl peut avoir plus ou moins de succès selon la page Web.
EightBitTony
le but est de pouvoir script ces choses sans analyse compliquée, curl va bien, mais jusqu'à présent, je n'ai pas été en mesure de collecter des options décentes pour cela non plus.
audio.zoom
2
Aha - Je me trompe, voir la réponse mise à jour. C'est pourquoi les sites stackexchange fonctionnent bien - tout le monde apprend quelque chose, même les personnes qui répondent aux questions!
EightBitTony
1
Cela a fonctionné pour moi pour le podcast stackexchange, qui me dérangeait depuis un moment. Merci.
Richard Campbell
75

Avec wget, vous pouvez le faire:

wget --trust-server-names <url> 

pour enregistrer le fichier en utilisant le dernier nom de fichier que le serveur vous a attribué.

Thi Duong Nguyen
la source
2
Je me demande quelle est la différence entre --trust-server-nameset--content-disposition
JamesTheAwesomeDude
3
On dirait que --trust-server-namessuit les redirections vers un autre fichier et --content-dispositionnomme le fichier avec le nom spécifié dans l'en-tête de la réponse sans qu'aucune redirection ne soit requise.
Asfand Qazi
1
Pourquoi cette fonctionnalité par défaut n'est-elle pas?!?!
hopeseekr
8
@hopeseekr Le serveur peut être méchant et appeler le fichier .bashrc si vous ne regardez pas attentivement. lists.gnu.org/archive/html/bug-wget/2012-04/msg00059.html
Patrick Conheady
3

Vous pouvez également utiliser aria2c - cela semble bien fonctionner avec les en-têtes Content-Disposition.

dkam
la source