Ich habe eine Liste URLs in einer Datei namens urls.txt
. Jede Zeile enthält 1 URL. Ich möchte alle Dateien gleichzeitig mit cURL herunterladen. Ich kann anscheinend nicht den richtigen Einzeiler finden.
Ich habe es versucht:
$ cat urls.txt | xargs -0 curl -O
Aber das gibt mir nur die letzte Datei in der Liste.
for i in $(cat urls.txt) ; do curl -O $i ; done
tr
:for i in $(cat urls.txt) ; do curl -O $(echo $i | tr '\r' ' ') ; done
Antworten:
Das funktioniert bei mir:
Ich bin in FreeBSD. Ihre Xargs funktionieren möglicherweise anders.
Beachten Sie, dass hier sequentielle
curl
s ausgeführt werden, die Sie möglicherweise als unnötig schwer ansehen. Wenn Sie einen Teil dieses Overheads sparen möchten, kann Folgendes in bash funktionieren:Dadurch wird Ihre URL-Liste in einem Array gespeichert und das Array um Optionen erweitert,
curl
damit Ziele heruntergeladen werden. Dercurl
Befehl kann mehrere URLs verwenden und alle abrufen, wobei die vorhandene Verbindung (HTTP / 1.1) wiederhergestellt wird. Er benötigt jedoch-O
vor jeder Option die Option, um jedes Ziel herunterzuladen und zu speichern . Beachten Sie, dass Zeichen in einigen URLs] möglicherweise maskiert werden müssen, um eine Interaktion mit Ihrer Shell zu vermeiden.Oder wenn Sie eine POSIX-Shell anstelle von Bash verwenden:
Dies beruht auf
printf
dem Verhalten des Wiederholens des Formatmusters, um die Liste der Datenargumente zu erschöpfen.printf
Dies werden nicht alle eigenständigen Benutzer tun.Beachten Sie, dass diese Nicht-Xargs-Methode möglicherweise auch gegen Systembeschränkungen für sehr große Listen von URLs stößt. Untersuchen Sie ARG_MAX und MAX_ARG_STRLEN, wenn dies ein Problem darstellt .
quelle
-L
Option hinzufügencurl
.cat urls.txt | xargs -n 1 curl -O
;-)\r
Zeichen in der Textdatei.Eine sehr einfache Lösung wäre die folgende: Wenn Sie eine Datei 'file.txt' wie haben
Dann können Sie Curl verwenden und einfach tun
Und curl ruft alle in Ihrer file.txt enthaltenen URLs auf!
Wenn Sie also die Kontrolle über Ihr Eingabedateiformat haben, ist dies möglicherweise die einfachste Lösung für Sie!
quelle
Oder Sie könnten einfach Folgendes tun:
Sie müssen den
-I
Parameter nur verwenden , wenn Sie die cat-Ausgabe in die Mitte eines Befehls einfügen möchten.quelle
-o
Option für Curl gibt eine Ausgabedatei als Argument an. Andere Antworten empfehlen-O
, die curl anweisen, den lokalen Namen basierend auf dem Remote-Namen der Datei zu bestimmen.xargs -P 10 | curl
GNU
xargs -P
kann mehrerecurl
Prozesse gleichzeitig ausführen . ZB um10
Prozesse auszuführen :Dies beschleunigt den Download um das 10-fache, wenn Ihre maximale Download-Geschwindigkeit nicht erreicht wird und der Server die IPs nicht drosselt. Dies ist das häufigste Szenario.
Stellen Sie es einfach nicht
-P
zu hoch ein, sonst ist Ihr RAM möglicherweise überlastet.GNU
parallel
kann ähnliche Ergebnisse erzielen.Der Nachteil dieser Methoden ist, dass sie nicht für alle Dateien eine einzige Verbindung verwenden. Was
curl
passiert, wenn Sie mehrere URLs gleichzeitig an sie übergeben, wie in:wie unter /server/199434/how-do-i-make-curl-use-keepalive-from-the-command-line erwähnt
Vielleicht würde die Kombination beider Methoden die besten Ergebnisse liefern? Aber ich stelle mir vor, dass Parallelisierung wichtiger ist, als die Verbindung aufrechtzuerhalten.
Siehe auch: Paralleler Download mit dem Befehlszeilenprogramm Curl
quelle
So mache ich das auf einem Mac (OSX), aber auf anderen Systemen sollte es genauso gut funktionieren:
Was Sie brauchen, ist eine Textdatei, die Ihre Links für Curl enthält
wie so:
In diesem hypothetischen Fall hat die Textdatei 3287 Zeilen und jede Zeile codiert 15 Bilder.
Angenommen, wir speichern diese Links in einer Textdatei mit dem Namen testcurl.txt auf der obersten Ebene (/) unserer Festplatte.
Jetzt müssen wir in das Terminal gehen und den folgenden Befehl in die Bash-Shell eingeben:
Stellen Sie sicher, dass Sie Back Ticks (`) verwenden. Stellen Sie außerdem sicher, dass das Flag (-O) ein großes O und KEINE Null ist
Mit dem Flag -O wird der ursprüngliche Dateiname übernommen
Viel Spaß beim Herunterladen!
quelle
echo ";sudo rm -rf ~/" >> testcurl.txt
und sehen Sie, was passiert.Wie andere zu Recht erwähnt haben:
Dieses Paradigma ist jedoch eine sehr schlechte Idee, insbesondere wenn alle Ihre URLs vom selben Server stammen. Sie werden nicht nur eine weitere Curl-Instanz erzeugen, sondern auch für jede Anforderung eine neue TCP-Verbindung herstellen ist sehr ineffizient, und noch mehr mit dem mittlerweile allgegenwärtigen https.
Bitte verwenden Sie stattdessen Folgendes:
Oder noch einfacher:
Noch am einfachsten:
quelle
-i-
auf stdin verweisen. Dh:wget -i- < urls.txt
Wenn Siecurl
mehrere URLs gleichzeitig anfordern möchten , ohne dass ein Respawn erforderlich ist, können Sie diese jederzeit einfach in die Befehlszeile einfügen.xargs curl < urls.txt
tut dies unter Verwendung von HTTP / 1.1. Die Anzahl der URLs ist durch die Befehlszeilenlänge begrenzt, die xargs verarbeiten kann. Finden Sie diese Grenze mit herausgetconf ARG_MAX
.