Трубный вывод cat для cURL для загрузки списка файлов - PullRequest
72 голосов
/ 26 марта 2012

У меня есть список URL-адресов в файле с именем urls.txt. Каждая строка содержит 1 URL. Я хочу скачать все файлы одновременно, используя cURL. Кажется, я не могу получить правильную однострочку.

Я пытался:

$ cat urls.txt | xargs -0 curl -O

Но это дает мне только последний файл в списке.

Ответы [ 6 ]

127 голосов
/ 26 марта 2012

Это работает для меня:

$ xargs -n 1 curl -O < urls.txt

Я во FreeBSD. Ваши xargs могут работать по-другому.

Обратите внимание, что это работает последовательно curl с, что вы можете считать излишне тяжелым. Если вы хотите сохранить некоторые из этих служебных данных, в bash может работать следующее:

$ mapfile -t urls < urls.txt
$ curl "${urls[@]/#/-O }"

Это сохранит ваш список URL в массив, а затем расширит массив с параметрами до curl, чтобы вызвать загрузку целей. Команда curl может взять несколько URL-адресов и извлечь все из них, перезапуская существующее соединение (HTTP / 1.1), но для этого требуется опция -O перед каждым, чтобы загрузить и сохранить каждую цель .

Или, если вы используете оболочку POSIX, а не bash:

$ curl $(printf ' -O %s' $(cat urls.txt))

Это зависит от поведения printf повторения шаблона формата для исчерпания списка аргументов данных; не все автономные printf s будут делать это.

Обратите внимание, что этот не-xargs метод также может столкнуться с системными ограничениями для очень больших списков URL. Исследуйте ARG_MAX и MAX_ARG_STRLEN , если это вызывает озабоченность.

26 голосов
/ 02 декабря 2015

Очень простое решение будет следующим: если у вас есть файл 'file.txt', такой как

url="http://www.google.de"
url="http://www.yahoo.de"
url="http://www.bing.de"

, тогда вы можете использовать curl и просто сделать

curl -K file.txt

Иcurl вызовет все URL-адреса, содержащиеся в вашем file.txt!

Так что, если у вас есть контроль над форматом входного файла, возможно, это самое простое решение для вас!

12 голосов
/ 02 августа 2013

Или вы можете просто сделать это:

cat urls.txt | xargs curl -O

Параметр -I необходимо использовать только в том случае, если вы хотите вставить вывод cat в середину команды.

8 голосов

xargs -P 10 | curl

GNU xargs -P может запускать несколько curl процессов параллельно.Например, чтобы запустить 10 процессов:

xargs -P 10 -n 1 curl -O < urls.txt

Это ускорит загрузку в 10 раз, если ваша максимальная скорость загрузки, если она не достигнута, и если сервер не регулирует IP-адреса, что является наиболее распространенным сценарием.

Только не устанавливайте -P слишком высоко, иначе ваша ОЗУ может быть перегружена.

GNU parallel может достичь аналогичных результатов.

Недостатком этих методов является то, что они не используютНе используйте одно соединение для всех файлов, что делает curl, если вы передаете ему несколько URL одновременно, как в:

curl -O out1.txt http://exmple.com/1 -O out2.txt http://exmple.com/2

, как указано в https://serverfault.com/questions/199434/how-do-i-make-curl-use-keepalive-from-the-command-line

Может бытьобъединение обоих методов даст лучшие результаты?Но я думаю, что распараллеливание важнее, чем поддержание соединения.

См. Также: Параллельная загрузка с использованием утилиты командной строки Curl

7 голосов
/ 04 января 2014

Вот как я это делаю на Mac (OSX), но он должен одинаково хорошо работать на других системах:

Вам нужен текстовый файл, содержащий ваши ссылки для curl

вроде так:

    http://www.site1.com/subdirectory/file1-[01-15].jpg
    http://www.site1.com/subdirectory/file2-[01-15].jpg
    .
    .
    http://www.site1.com/subdirectory/file3287-[01-15].jpg

В этом гипотетическом случае текстовый файл имеет 3287 строк, и каждая строка кодирует 15 изображений.

Допустим, мы сохранили эти ссылки в текстовом файле testcurl.txt на верхнем уровне (/) нашего жесткого диска.

Теперь мы должны зайти в терминал и ввести следующую команду в оболочке bash:

    for i in "`cat /testcurl.txt`" ; do curl -O "$i" ; done

Убедитесь, что вы используете обратные галочки (`) Также убедитесь, что флаг (-O) является заглавной O, а НЕ ноль

с флагом -O, исходное имя файла будет взято

Удачной загрузки!

3 голосов
/ 15 августа 2015

Как справедливо отмечали другие:

-cat urls.txt | xargs -0 curl -O
+cat urls.txt | xargs -n1 curl -O

Однако эта парадигма очень плохая идея, особенно если все ваши URL-адреса приходят с одного и того же сервера - вы не только будете появлятьсядругой экземпляр curl, но он также будет устанавливать новое TCP-соединение для каждого запроса, что крайне неэффективно, и даже более того, теперь это вездесущий https.

Пожалуйста, используйте это вместо:

-cat urls.txt | xargs -n1 curl -O
+cat urls.txt | wget -i/dev/fd/0

Или, еще проще:

-cat urls.txt | wget -i/dev/fd/0
+wget -i/dev/fd/0 < urls.txt

Простейший из всех:

-wget -i/dev/fd/0 < urls.txt
+wget -iurls.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...