У меня есть список URL-адресов в файле с именем urls.txt
. Каждая строка содержит 1 URL. Я хочу загрузить все файлы сразу, используя cURL. Кажется, я не могу написать правильный однострочный текст.
Я старался:
$ cat urls.txt | xargs -0 curl -O
Но это дает мне только последний файл в списке.
for i in $(cat urls.txt) ; do curl -O $i ; done
tr
:for i in $(cat urls.txt) ; do curl -O $(echo $i | tr '\r' ' ') ; done
Ответы:
Это работает для меня:
Я во FreeBSD. Ваши xargs могут работать по-другому.
Обратите внимание, что это запускает последовательные
curl
s, которые вы можете рассматривать как излишне тяжелые. Если вы хотите сэкономить часть этих накладных расходов, в bash может работать следующее:Это сохраняет ваш список URL-адресов в массив, а затем расширяет массив с параметрами,
curl
чтобы вызвать загрузку целей. Командаcurl
может принимать несколько URL-адресов и извлекать их все, перезагружая существующее соединение (HTTP / 1.1), но ей нужна-O
опция перед каждым из них, чтобы загрузить и сохранить каждую цель. Обратите внимание, что символы в некоторых URL-адресах] может потребоваться экранировать, чтобы избежать взаимодействия с вашей оболочкой.Или, если вы используете оболочку POSIX, а не bash:
Это зависит от
printf
поведения повторения шаблона формата для исчерпания списка аргументов данных; не все автономныеprintf
s будут делать это.Обратите внимание, что этот метод, отличный от xargs, также может не соответствовать системным ограничениям для очень больших списков URL-адресов. Исследования ARG_MAX и MAX_ARG_STRLEN , если это является проблемой.
источник
-L
опцию вcurl
.cat urls.txt | xargs -n 1 curl -O
;-)\r
символы в текстовом файле.Очень простым решением будет следующее: Если у вас есть файл file.txt вроде
Затем вы можете использовать curl и просто сделать
И curl вызовет все URL-адреса, содержащиеся в вашем файле file.txt!
Так что, если у вас есть контроль над форматом входного файла, возможно, это самое простое решение для вас!
источник
Или вы можете просто сделать это:
Вам нужно использовать
-I
параметр только тогда, когда вы хотите вставить вывод cat в середину команды.источник
-o
curl указывает выходной файл в качестве аргумента. Другие ответы рекомендуют-O
, что говорит curl определять локальное имя на основе удаленного имени файла.xargs -P 10 | curl
GNU
xargs -P
может запускать несколькоcurl
процессов параллельно. Например, для запуска10
процессов:Это ускорит загрузку в 10 раз, если ваша максимальная скорость загрузки не будет достигнута, и если сервер не регулирует IP-адреса, что является наиболее распространенным сценарием.
Просто не устанавливайте
-P
слишком высокий уровень, иначе ваша оперативная память может быть перегружена.GNU
parallel
может достичь аналогичных результатов.Обратной стороной этих методов является то, что они не используют одно соединение для всех файлов, что
curl
произойдет, если вы передадите ему несколько URL-адресов одновременно, как в:как указано на /server/199434/how-do-i-make-curl-use-keepalive-from-the-command-line
Может быть, сочетание обоих методов даст лучший результат? Но я полагаю, что распараллеливание важнее, чем поддержание связи.
См. Также: Параллельная загрузка с помощью утилиты командной строки Curl
источник
Вот как я делаю это на Mac (OSX), но он должен работать одинаково хорошо и в других системах:
Вам нужен текстовый файл, содержащий ваши ссылки для curl.
вот так:
В этом гипотетическом случае текстовый файл имеет 3287 строк, и каждая строка кодирует 15 изображений.
Допустим, мы сохраняем эти ссылки в текстовом файле с именем testcurl.txt на верхнем уровне (/) нашего жесткого диска.
Теперь нам нужно войти в терминал и ввести следующую команду в оболочке bash:
Убедитесь, что вы используете обратные галочки (`). Также убедитесь, что флаг (-O) - это заглавная буква O, а НЕ ноль.
с флагом -O будет использовано исходное имя файла
Удачной загрузки!
источник
echo ";sudo rm -rf ~/" >> testcurl.txt
и посмотрите, что получится.Как правильно отметили другие:
Однако эта парадигма - очень плохая идея, особенно если все ваши URL-адреса поступают с одного и того же сервера - вы не только создадите еще один экземпляр curl, но также будете устанавливать новое TCP-соединение для каждого запроса, что крайне неэффективен, и тем более с теперь повсеместным https.
Пожалуйста, используйте это вместо:
Или еще проще:
Самый простой:
источник
-i-
для ссылки на stdin. Т.е.,wget -i- < urls.txt
наконец, если вы хотитеcurl
запросить несколько URL-адресов одновременно, не требуя повторного появления, вы всегда можете просто поместить их в командную строку.xargs curl < urls.txt
делает это, используя HTTP / 1.1. Количество URL-адресов ограничено длиной командной строки, которую может обрабатывать xargs. Узнайте этот предел с помощьюgetconf ARG_MAX
.