Ответ 1
Это работает для меня:
$ xargs -n 1 curl -O < urls.txt
Я во FreeBSD. Ваши xarg могут работать по-другому.
У меня есть URL-адрес списка в файле с именем urls.txt
. Каждая строка содержит 1 URL. Я хочу загрузить все файлы одновременно с помощью cURL. Кажется, я не могу получить правильный однострочный снимок.
Я пробовал:
$ cat urls.txt | xargs -0 curl -O
Но это дает мне только последний файл в списке.
Это работает для меня:
$ xargs -n 1 curl -O < urls.txt
Я во FreeBSD. Ваши xarg могут работать по-другому.
Очень простым решением было бы следующее: Если у вас есть файл '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!
Итак, если у вас есть контроль над форматом ввода файла, возможно, это самое простое решение для вас!
Или вы могли бы просто сделать это:
cat urls.txt | xargs curl -O
Вам нужно использовать параметр -I
, если вы хотите вставить вывод cat в середину команды.
Вот как я это делаю на 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, будет записано исходное имя файла
Счастливая загрузка!
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
Как справедливо упоминали другие:
-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