Bene, curl
è solo un semplice processo UNIX. Puoi avere tanti di questi curl
processi in esecuzione in parallelo e che inviano i loro output a file diversi.
curl
può utilizzare la parte del nome file dell'URL per generare il file locale. Basta usare il -O
opzione (man curl
per i dettagli).
Potresti usare qualcosa di simile al seguente
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
La mia risposta è un po' in ritardo, ma credo che tutte le risposte esistenti siano un po' insufficienti. Il modo in cui faccio cose del genere è con xargs
, che è in grado di eseguire un numero specificato di comandi nei sottoprocessi.
La battuta che userei è, semplicemente:
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
Questo merita qualche spiegazione. L'uso di -n 1
istruisce xargs
per elaborare un singolo argomento di input alla volta. In questo esempio, i numeri 1 ... 10
vengono elaborati ciascuno separatamente. E -P 2
dice xargs
per mantenere sempre in esecuzione 2 sottoprocessi, ognuno dei quali gestisce un singolo argomento, fino a quando tutti gli argomenti di input non sono stati elaborati.
Puoi pensare a questo come MapReduce nella shell. O forse solo la fase Mappa. Indipendentemente da ciò, è un modo efficace per portare a termine un sacco di lavoro assicurandoti di non bombardare la tua macchina. È possibile fare qualcosa di simile in un ciclo for in una shell, ma finire per eseguire la gestione dei processi, il che inizia a sembrare piuttosto inutile una volta che ti rendi conto di quanto follemente fantastico questo uso di xargs
è.
Aggiornamento:sospetto che il mio esempio con xargs
potrebbe essere migliorato (almeno su Mac OS X e BSD con -J
bandiera). Con GNU Parallel, anche il comando è un po' meno ingombrante:
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}