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

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

Я пробовал:

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

curl -K file.txt

И curl вызовет все Urls, содержащиеся в файле file.txt!

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

Ответ 3

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

cat urls.txt | xargs curl -O

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

Ответ 4

Вот как я это делаю на 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 и NOT zero

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

Счастливая загрузка!

Ответ 5

xargs -P 10 из GNU загружает файлы параллельно до 10 потоков:

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

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

Просто не устанавливайте слишком высокий уровень -P или ваша RAM может быть перегружена.

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

Ответ 6

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

-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