Nah, curl
hanyalah proses UNIX sederhana. Anda dapat memiliki sebanyak mungkin curl
ini proses berjalan secara paralel dan mengirimkan keluarannya ke file yang berbeda.
curl
dapat menggunakan bagian nama file dari URL untuk menghasilkan file lokal. Cukup gunakan -O
opsi (man curl
untuk detail).
Anda dapat menggunakan sesuatu seperti berikut
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
Jawaban saya agak terlambat, tetapi saya yakin semua jawaban yang ada sedikit kurang. Cara saya melakukan hal-hal seperti ini adalah dengan xargs
, yang mampu menjalankan sejumlah perintah tertentu dalam subproses.
One-liner yang akan saya gunakan adalah, cukup:
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
Ini memerlukan beberapa penjelasan. Penggunaan -n 1
menginstruksikan xargs
untuk memproses argumen input tunggal pada satu waktu. Dalam contoh ini, angka 1 ... 10
masing-masing diproses secara terpisah. Dan -P 2
memberi tahu xargs
untuk menjaga 2 subproses berjalan sepanjang waktu, masing-masing menangani satu argumen, sampai semua argumen masukan telah diproses.
Anda dapat menganggap ini sebagai MapReduce di shell. Atau mungkin hanya fase Peta. Terlepas dari itu, ini adalah cara yang efektif untuk menyelesaikan banyak pekerjaan sambil memastikan bahwa Anda tidak merusak mesin Anda. Dimungkinkan untuk melakukan sesuatu yang serupa dalam for loop di shell, tetapi akhirnya melakukan manajemen proses, yang mulai tampak tidak berguna setelah Anda menyadari betapa hebatnya penggunaan xargs
ini adalah.
Pembaruan:Saya menduga contoh saya dengan xargs
dapat ditingkatkan (setidaknya di Mac OS X dan BSD dengan -J
bendera). Dengan GNU Parallel, perintahnya juga tidak terlalu berat:
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}