Это работает для меня:
$ xargs -n 1 curl -O < urls.txt
Я во FreeBSD. Ваши xargs могут работать по-другому.
Обратите внимание, что это запускает последовательные curl
s, которые вы можете рассматривать как излишне тяжелые. Если вы хотите сэкономить часть этих накладных расходов, в bash может работать следующее:
$ mapfile -t urls < urls.txt
$ curl ${urls[@]/#/-O }
Это сохраняет ваш список URL-адресов в массив, а затем расширяет массив с параметрами, curl
чтобы вызвать загрузку целей. Команда curl
может принимать несколько URL-адресов и извлекать их все, перезагружая существующее соединение (HTTP / 1.1), но ей нужна -O
опция перед каждым из них, чтобы загрузить и сохранить каждую цель. Обратите внимание, что символы в некоторых URL-адресах] может потребоваться экранировать, чтобы избежать взаимодействия с вашей оболочкой.
Или, если вы используете оболочку POSIX, а не bash:
$ curl $(printf ' -O %s' $(cat urls.txt))
Это зависит от printf
поведения повторения шаблона формата для исчерпания списка аргументов данных; не все автономные printf
s будут делать это.
Обратите внимание, что этот метод, отличный от xargs, также может не соответствовать системным ограничениям для очень больших списков URL-адресов. Исследования ARG_MAX и MAX_ARG_STRLEN , если это является проблемой.
for i in $(cat urls.txt) ; do curl -O $i ; done