curl télécharger plusieurs fichiers avec la syntaxe d'accolade

17

J'essaie de télécharger deux fichiers par la syntaxe suivante:

curl -O http://domain/path/to/{file1,file2}

Le problème est que seul le premier fichier est réellement enregistré localement, et le second a été simplement imprimé sur stdout.

Je me suis rendu compte que si j'ajoute un -Oça marche très bien:

curl -OO http://domain/path/to/{file1,file2}

Mais n'est-ce pas impossible si le nombre de fichiers augmente trop? Par exemple,

curl -O http://domain/path/to/file[1,100]

Ma question est, est-il vraiment impossible de télécharger plusieurs fichiers individuels à la fois avec curl(sans en ajouter un nombre correct -O)?

Naitree
la source
1
Pourquoi ne pas utiliser une boucle for ou utiliser wget à la place?
Rui F Ribeiro
1
@RuiFRibeiro (1) Oui, je peux utiliser la boucle. Je suis simplement curieux de savoir si je peux curly arriver. (2) Je ne considère pas seulement les protocoles HTTP, FTP, par exemple SFTP.
Naitree
Je veux dire, étant un outil si puissant, pourquoi curléchoue-t-il à cette fonctionnalité pas si difficile?
Naitree
1
Juste pour préciser que la syntaxe {}and [](et aussi *and ?) est la globalisation / expansion du shell , curlne les voit jamais, c'est la même chose quecurl url1 url2
vonbrand
wget ne gère pas SSL
MikeW

Réponses:

9

Mise à jour: cela a été implémenté dans curl 7.19.0. Voir la réponse @Besworks.

Selon la page de manuel, il n'y a aucun moyen de conserver le nom de fichier d'origine sauf en utilisant plusieurs O´s. Vous pouvez également utiliser vos propres noms de fichiers:

curl http://{one,two}.site.com -o "file_#1.txt"

résultant en http://one.site.cométant enregistré file_one.txtet http://two.site.comenregistré dansfile_two.txt .

ou même plusieurs variables comme

curl http://{site,host}.host[1-5].com -o "#1_#2"

résultant en http://site.host1.comêtre enregistré sur site_1, http://host.host1.comêtre enregistré sur host_1et ainsi de suite.

jschlichtholz
la source
Ou vous pourriez faire quelque chose commecurl -$(printf 'O%.0s' {1..3}) http://domain/path/to/{file1,file2,file3}
Max Coplan
23

Je me rends compte qu'il existe déjà une réponse acceptée à cette question, mais je pense que je dois souligner qu'il existe en fait un moyen de le faire.

L' --remote-name-alloption indique à curl de se comporter comme si vous utilisiez -Oou --remote-namepour chaque fichier.

https://curl.haxx.se/docs/manpage.html#--remote-name-all

Cette option est disponible depuis la version 7.19.0

https://curl.haxx.se/changes.html#7_19_0

Besworks
la source
0

Il existe une autre façon de télécharger plusieurs fichiers avec curl:

urls="firstUrl secondUrl thirdUrl" 
for url in $urls
do
   curl -O "$url"
done

Remarque : l'espace obligatoire est utilisé pour délimiter différentes URL.

daGo
la source