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}