Bueno, curl
es solo un proceso UNIX simple. Puedes tener tantos de estos curl
procesos que se ejecutan en paralelo y envían sus resultados a diferentes archivos.
curl
puede usar la parte del nombre de archivo de la URL para generar el archivo local. Solo usa el -O
opción (man curl
para más detalles).
Podrías usar algo como lo siguiente
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
Mi respuesta es un poco tardía, pero creo que todas las respuestas existentes se quedan un poco cortas. La forma en que hago cosas como esta es con xargs
, que es capaz de ejecutar un número específico de comandos en subprocesos.
La frase de una sola línea que usaría es, simplemente:
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
Esto amerita alguna explicación. El uso de -n 1
instruye xargs
para procesar un solo argumento de entrada a la vez. En este ejemplo, los números 1 ... 10
cada uno se procesa por separado. Y -P 2
le dice a xargs
para mantener 2 subprocesos ejecutándose todo el tiempo, cada uno manejando un solo argumento, hasta que se hayan procesado todos los argumentos de entrada.
Puede pensar en esto como MapReduce en el shell. O tal vez solo la fase del Mapa. De todos modos, es una forma efectiva de hacer mucho trabajo mientras se asegura de no bombardear su máquina. Es posible hacer algo similar en un bucle for en un shell, pero terminar haciendo la gestión de procesos, lo que comienza a parecer bastante inútil una vez que te das cuenta de lo increíblemente bueno que es este uso de xargs
es.
Actualización:sospecho que mi ejemplo con xargs
podría mejorarse (al menos en Mac OS X y BSD con el -J
bandera). Con GNU Parallel, el comando también es un poco menos difícil de manejar:
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}