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 ?

183voto

jmanning2k Points 3354

Le côté distant envoie le nom de fichier en utilisant l'en-tête Content-Disposition.

curl 7.21.2 ou une version ultérieure le fait automatiquement si vous spécifiez --remote-header-name / -J.

curl -O -J -L $url

La version étendue des arguments serait :

curl --remote-name --remote-header-name --location $url

35voto

unhillbilly Points 4604

Si vous avez une version récente de curl (7.21.2 ou ultérieure), consultez la réponse de @jmanning2k.

Si vous avez une ancienne version de curl (comme 7.19.7 qui était livrée avec Snow Leopard), faites deux requêtes : un HEAD pour obtenir le nom du fichier depuis l'en-tête de la réponse, puis un GET :

url="http://www.vim.org/scripts/download_script.php?src_id=10872"
filename=$(curl -sI  "$url" | grep -o -E 'filename=.*$' | sed -e 's/filename=//')
curl -o "$filename" -L "$url"

20voto

JacekM Points 1360

Si vous pouvez utiliser wget au lieu de curl:

wget --content-disposition $url

12voto

Diskutant Points 177

Je voulais commenter la réponse de jmanning2k mais en tant que nouvel utilisateur je ne peux pas le faire, donc j'ai essayé de modifier son message ce qui est autorisé, mais la modification a été rejetée en disant que cela devait être un commentaire. soupir

Quoi qu'il en soit, considérez cela comme un commentaire à sa réponse merci.

Cela semble ne fonctionner que si l'en-tête ressemble à filename=pythoncomplete.vim comme dans l'exemple, mais certains sites envoient un en-tête qui ressemble à filename*=UTF-8' 'filename.zip' celui-ci n'est pas reconnu par curl 7.28.0

6voto

Je voulais une solution qui fonctionnait à la fois sur les anciens et les nouveaux Mac, et le code hérité que David a fourni pour Snow Leopard ne se comportait pas bien sous Mavericks. Voici une fonction que j'ai créée basée sur le code de David:

function getUriFilename() {
    header="$(curl -sI "$1" | tr -d '\r')"

    filename="$(echo "$header" | grep -o -E 'filename=.*$')"
    if [[ -n "$filename" ]]; then
        echo "${filename#filename=}"
        return
    fi

    filename="$(echo "$header" | grep -o -E 'Location:.*$')"
    if [[ -n "$filename" ]]; then
        basename "${filename#Location\:}"
        return
    fi

    return 1
}

Avec ceci défini, vous pouvez exécuter:

url="http://www.vim.org/scripts/download_script.php?src_id=10872"
filename="$(getUriFilename $url)"
curl -L $url -o "$filename"

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