Вывод трубы cat to cURL для загрузки списка файлов


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

пробовал:

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

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

6 63

6 ответов:

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

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

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

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

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

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

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

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

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

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

очень простое решение было бы следующим: Если у вас есть файл'.txt ' like

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

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

curl -K file.txt

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

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

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

cat urls.txt | xargs curl -O

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

xargs-P 10 из GNU загружает файлы параллельно до 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 утилита строке

вот как я это делаю на 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, исходное имя файла будет принято

счастливый скачивание!

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

-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