100 votes

Curl pour obtenir le nom de fichier distant après avoir suivi l'emplacement

Lors du téléchargement d'un fichier à l'aide de curl, comment suivre un emplacement de lien et l'utiliser pour le nom de fichier de sortie (sans connaître le nom du fichier distant à l'avance)?

Par exemple, si l'on clique sur le lien ci-dessous, vous téléchargeriez un fichier nommé "pythoncomplete.vim". Cependant, en utilisant les options -O et -L de curl, le nom de fichier est simplement le nom distant d'origine, un maladroit "download_script.php?src_id=10872".

curl -O -L http://www.vim.org/scripts/download_script.php?src_id=10872

Pour télécharger le fichier avec le nom correct, vous devriez connaître le nom du fichier à l'avance :

curl -o pythoncomplete.vim -L http://www.vim.org/scripts/download_script.php?src_id=10872

Ce serait excellent si vous pouviez télécharger le fichier sans connaître le nom à l'avance, et sinon, y a-t-il un autre moyen de télécharger rapidement un fichier redirigé via la ligne de commande ?

2voto

drater Points 21

Veuillez noter que certains serveurs Web mal configurés serviront le nom en utilisant "Filename" comme clé, alors que la RFC2183 spécifie qu'il devrait être "filename". curl ne gère que le dernier cas.

2voto

Jackfritt Points 1

J'avais le même problème que John Cooper. Je n'ai pas obtenu de nom de fichier mais un nom de fichier de localisation en retour. Sa réponse a également fonctionné mais nécessite 2 commandes. Ce code en une ligne a fonctionné pour moi....

url="https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=de";url=$(curl -L --head -w '%{url_effective}' $url 2>/dev/null | tail -n1) ; curl -O $url

Volé et ajouté des trucs depuis https://unix.stackexchange.com/questions/126252/resolve-filename-from-a-remote-url-without-downloading-a-file

1voto

John Cooper Points 131

Un exemple utilisant la réponse ci-dessus pour le dépôt d'artefacts Apache Archiva pour extraire la dernière version. Le curl renvoie la ligne Location et le nom de fichier se trouve à la fin de la ligne. Besoin de supprimer le CR à la fin du nom de fichier.

url="http://archiva:8080/restServices/archivaServices/searchService/artifact?g=com.imgur.backup&a=snapshot-s3-util&v=LATEST"
filename=$(curl --silent -sI -u user:password $url | grep Location | awk -F\/ '{print $NF}' | sed 's/\r$//')
curl --silent -o $filename -L -u user:password $url

1voto

lwei Points 55

Au lieu d'appliquer grep et d'autres opérations Unix-Fu, curl est livré avec une variable d'option intégrée "Write Out"[1] spécifiquement pour un tel cas, par exemple

$ curl -OJsL "http://www.vim.org/scripts/download_script.php?src_id=10872" -w "%{filename_effective}"
pythoncomplete.vim

[1] <a href="https://everything.curl.dev/usingcurl/verbose/writeout#available-write-out-variables" rel="nofollow noreferrer">https://everything.curl.dev/usingcurl/verbose/writeout#available-write-out-variables</a>

0voto

loretoparisi Points 1206

En utilisant la solution proposée ci-dessus, j'ai écrit cette fonction d'aide curl2file.

[MISE À JOUR]

function curl2file() {
    url=$1
    url=$(curl -o /dev/null -L --head -w '%{url_effective}' $url 2>/dev/null | tail -n1) ; curl -O $url
}

Utilisation:

curl2file https://cloud.tsinghua.edu.cn/f/4666d28af98a4e63afb5/?dl=1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X