Вывод трубы 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 могут работать по-разному.
обратите внимание, что это работает секвентальная
curl
s, которые вы можете рассматривать как излишне тяжелые. Если вы хотите сохранить некоторые из этих накладные, могут работать в 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
поведение повторения шаблона формата для исчерпания списка аргументов данных; не все автономныеprintf
s сделает это.обратите внимание, что этот метод не-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