Eh bien, curl
n'est qu'un simple processus UNIX. Vous pouvez avoir autant de ces curl
processus s'exécutant en parallèle et envoyant leurs sorties vers différents fichiers.
curl
peut utiliser la partie nom de fichier de l'URL pour générer le fichier local. Utilisez simplement le -O
choix (man curl
pour plus de détails).
Vous pouvez utiliser quelque chose comme ce qui suit
urls="http://example.com/?page1.html http://example.com?page2.html" # add more URLs here
for url in $urls; do
# run the curl job in the background so we can start another job
# and disable the progress bar (-s)
echo "fetching $url"
curl $url -O -s &
done
wait #wait for all background jobs to terminate
Ma réponse est un peu tardive, mais je pense que toutes les réponses existantes sont un peu courtes. La façon dont je fais des choses comme ça est avec xargs
, qui est capable d'exécuter un nombre spécifié de commandes dans les sous-processus.
Le one-liner que j'utiliserais est simplement :
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
Cela mérite quelques explications. L'utilisation de -n 1
ordonne xargs
pour traiter un seul argument d'entrée à la fois. Dans cet exemple, les nombres 1 ... 10
sont chacune traitées séparément. Et -P 2
dit xargs
pour garder 2 sous-processus en cours d'exécution en permanence, chacun gérant un seul argument, jusqu'à ce que tous les arguments d'entrée aient été traités.
Vous pouvez considérer cela comme MapReduce dans le shell. Ou peut-être juste la phase Carte. Quoi qu'il en soit, c'est un moyen efficace de faire beaucoup de travail tout en veillant à ne pas bombarder votre machine. Il est possible de faire quelque chose de similaire dans une boucle for dans un shell, mais finit par faire de la gestion de processus, ce qui commence à sembler assez inutile une fois que vous réalisez à quel point cette utilisation de xargs
est incroyablement géniale est.
Mise à jour :je soupçonne que mon exemple avec xargs
pourrait être amélioré (au moins sur Mac OS X et BSD avec le -J
drapeau). Avec GNU Parallel, la commande est également un peu moins compliquée :
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}