To działa dla mnie:
$ xargs -n 1 curl -O < urls.txt
Jestem we FreeBSD. Twoje xargs mogą działać inaczej.
Zauważ, że działa to sekwencyjnie curl, które możesz uznać za niepotrzebnie ciężkie. Jeśli chcesz zaoszczędzić trochę tego narzutu, poniższe mogą działać w bashu:
$ mapfile -t urls < urls.txt
$ curl ${urls[@]/#/-O }
Spowoduje to zapisanie listy adresów URL w tablicy, a następnie rozszerzenie tablicy z opcjami, curlaby spowodować pobranie celów. curlKomenda może trwać wiele adresów URL i pobrać wszystkie z nich, recykling istniejącego połączenia (HTTP / 1.1), ale potrzebuje -Oopcji przed każdym z nich, aby pobrać i zapisać każdy cel. Zwróć uwagę, że znaki w niektórych adresach URL] mogą wymagać zmiany znaczenia, aby uniknąć interakcji z powłoką.
Lub jeśli używasz powłoki POSIX zamiast bash:
$ curl $(printf ' -O %s' $(cat urls.txt))
Zależy to od printfzachowania polegającego na powtarzaniu wzorca formatu w celu wyczerpania listy argumentów danych; nie wszystkie samodzielne komputery printfto zrobią.
Zwróć uwagę, że ta metoda inna niż xargs może również wpływać na ograniczenia systemu w przypadku bardzo dużych list adresów URL. Badania ARG_MAX i MAX_ARG_STRLEN jeśli jest to problemem.
for i in $(cat urls.txt) ; do curl -O $i ; done