Загрузить URL, указанные в файле, используя curl? [закрыто]

15

У меня есть файл, в котором есть все URL-адреса, из которых мне нужно скачать. Однако мне нужно ограничить одну загрузку за раз. т.е. следующая загрузка должна начаться только после завершения предыдущей. Возможно ли это с помощью curl? Или я должен использовать что-нибудь еще.

Dev
источник
3
Здравствуйте и добро пожаловать в serverfault. Задавая вопросы на этом сайте, всегда помните, что мы не на вашем месте и не можем угадать, какую среду вы используете. В этом случае вы не указали, какую ОС вы используете, что затруднит правильный ответ.
Стефан

Ответы:

20
xargs -n 1 curl -O < your_files.txt
Grumdrig
источник
2
Это лучший ответ. Хотя спрашивающий не указал, вероятно, можно с уверенностью предположить, что ответы на все URL-адреса должны быть записаны в отдельные файлы. Используйте -Oопцию cURL, чтобы сделать это. xargs -n 1 curl -O < your_file.txt
LS
Я согласен. Так отредактировано.
Грумдриг,
Это действительно то, что мне нужно.
Ву Леданг
19

wget(1) работает последовательно по умолчанию и имеет встроенную опцию:

   -i file
   --input-file=file
       Read URLs from a local or external file.  If - is specified as file, URLs are read from the standard input.  (Use ./- to read from a file literally named -.)

       If this function is used, no URLs need be present on the command line.  If there are URLs both on the command line and in an input file, those on the command lines will be the first ones to be retrieved.  If
       --force-html is not specified, then file should consist of a series of URLs, one per line.

       However, if you specify --force-html, the document will be regarded as html.  In that case you may have problems with relative links, which you can solve either by adding "<base href="url">" to the documents
       or by specifying --base=url on the command line.

       If the file is an external one, the document will be automatically treated as html if the Content-Type matches text/html.  Furthermore, the file's location will be implicitly used as base href if none was
       specified.
Дауд
источник
3
Поскольку спрашивающий хотел знать, как это сделать с помощью cURL, вы должны как минимум включить решение, которое пытается его использовать.
LS
4

Это возможно с помощью curl в сценарии оболочки, что-то вроде этого, но вам нужно будет изучить соответствующие параметры для curl и т.д. для себя

while read URL
    curl some options $URL
    if required check exit status 
          take appropriate action
done <fileontainingurls
user9517
источник
2
Я понимаю, что это наполовину псевдокод, но я думаю, что цикл while должен иметь «do».
NWK
1
@nwk это полностью псевдокод, и я не согласен.
user9517
Что если URL содержит амперсанды? Будут ли они сбежать? Без экранирования оболочка будет думать, что команда должна выполняться в фоновом режиме.
Джаггер
2

Основано на ответе @iain, но с использованием правильных сценариев оболочки -

while read url; do
  echo "== $url =="
  curl -sL -O "$url"
done < list_of_urls.txt

Также будет работать со странными персонажами, такими как амперсанды и т.д ...

-OВместо этого можно заменить перенаправлением в файл или любым другим способом.

Евгений
источник