Das funktioniert bei mir:
$ xargs -n 1 curl -O < urls.txt
Ich bin in FreeBSD. Ihre Xargs funktionieren möglicherweise anders.
Beachten Sie, dass hier sequentielle curls 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:
$ mapfile -t urls < urls.txt
$ curl ${urls[@]/#/-O }
Dadurch wird Ihre URL-Liste in einem Array gespeichert und das Array um Optionen erweitert, curldamit Ziele heruntergeladen werden. Der curlBefehl kann mehrere URLs verwenden und alle abrufen, wobei die vorhandene Verbindung (HTTP / 1.1) wiederhergestellt wird. Er benötigt jedoch -Ovor 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:
$ curl $(printf ' -O %s' $(cat urls.txt))
Dies beruht auf printfdem Verhalten des Wiederholens des Formatmusters, um die Liste der Datenargumente zu erschöpfen. printfDies 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 .
for i in $(cat urls.txt) ; do curl -O $i ; done