Вывод трубы cat to cURL для загрузки списка файлов
у меня есть список URL-адресов в файле с именем urls.txt. Каждая строка содержит 1 URL. Я хочу загрузить все файлы сразу с помощью cURL. Кажется, я не могу получить правильный лайнер.
пробовал:
$ cat urls.txt | xargs -0 curl -O
но это только дает мне последний файл в списке.
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