Nun, curl ist nur ein einfacher UNIX-Prozess. Sie können so viele dieser curl haben Prozesse, die parallel laufen und ihre Ausgaben an verschiedene Dateien senden.
curl kann den Dateinamensteil der URL verwenden, um die lokale Datei zu generieren. Verwenden Sie einfach die -O Option (man curl für Einzelheiten).
Sie könnten so etwas wie das Folgende verwenden
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
Meine Antwort ist ein bisschen spät, aber ich glaube, dass alle vorhandenen Antworten nur ein bisschen zu kurz kommen. Ich mache solche Dinge mit xargs , der in der Lage ist, eine bestimmte Anzahl von Befehlen in Unterprozessen auszuführen.
Der Einzeiler, den ich verwenden würde, ist einfach:
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
Dies rechtfertigt eine Erklärung. Die Verwendung von -n 1 weist xargs an um jeweils ein einzelnes Eingabeargument zu verarbeiten. In diesem Beispiel die Zahlen 1 ... 10 werden jeweils separat verarbeitet. Und -P 2 sagt xargs zwei Unterprozesse ständig laufen zu lassen, von denen jeder ein einzelnes Argument verarbeitet, bis alle Eingabeargumente verarbeitet wurden.
Sie können sich dies als MapReduce in der Shell vorstellen. Oder vielleicht nur die Map-Phase. Unabhängig davon ist es eine effektive Möglichkeit, viel Arbeit zu erledigen und gleichzeitig sicherzustellen, dass Sie Ihre Maschine nicht mit einer Gabel bombardieren. Es ist möglich, etwas Ähnliches in einer for-Schleife in einer Shell zu tun, aber am Ende Prozessmanagement zu betreiben, was ziemlich sinnlos erscheint, sobald Sie erkennen, wie wahnsinnig großartig diese Verwendung von xargs ist ist.
Update:Ich vermute, dass mein Beispiel mit xargs verbessert werden könnte (zumindest auf Mac OS X und BSD mit dem -J Flagge). Bei GNU Parallel ist der Befehl auch etwas weniger umständlich:
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}