Как автоматически возобновить прерванную загрузку в curl?

Я работаю с curl в Linux. Я загружаю часть файла на ftp-сервер (используя опцию -r), но у меня плохое соединение, оно постоянно прерывается. Я хочу написать скрипт, который возобновит загрузку, когда я снова подключусь.

Я использовал эту команду, но она не работает:

until curl -r 666-9999 -C - --retry 999 -o "path/to/file" "ftp:/path/to/remote/file"; do :; done

person Bili the big    schedule 01.11.2013    source источник


Ответы (3)


curl -L -O your_url

Это загрузит файл.

Теперь предположим, что ваше соединение прервано;

curl -L -O -C - your_url

Это продолжит загрузку с последнего загруженного байта.

На справочной странице:

Используйте -C -, чтобы сообщить curl автоматически выяснить, где/как возобновить передачу. Затем он использует данные выходные/входные файлы, чтобы выяснить это.

person Jithin    schedule 17.11.2017
comment
да, и если вы хотите указать выходной файл с --output, это тоже сработает. с перенаправлением (> myfile) это не так (очевидно) - person phil294; 15.08.2018

wget был создан специально для этого варианта использования. Со страницы руководства:

Wget has been designed for robustness over slow or unstable network connections;
if a download fails due to a network problem, it will keep retrying until the
whole file has been retrieved.  If the server supports regetting, it will
instruct the server to continue the download from where it left off.

wget доступен практически для всех дистрибутивов Linux — возможно, он уже установлен в вашем. Просто используйте wget для загрузки файла, он восстановит сетевое соединение, пока файл не будет полностью передан.

person sjaensch    schedule 01.11.2013
comment
Поддерживает ли wget частичную загрузку файла (например, параметр -r в curl)? - person Bili the big; 01.11.2013
comment
согласно man-странице, он не поддерживает загрузку только части файла, но флаг -c позволяет продолжить загрузку. - person Wayne Werner; 01.11.2013
comment
Насколько я знаю, это не так, он поддерживает только возобновление частично загруженного файла, как сказал Уэйн. Зачем вам это нужно? wget позаботится о загрузке всего файла (и только тех частей, которые вы еще не загрузили). - person sjaensch; 01.11.2013
comment
Я хочу автоматически обнаруживать отключение от Интернета при загрузке... как я могу это сделать? - person Bili the big; 01.11.2013
comment
Ну, вы можете проанализировать вывод wget или создать отдельный скрипт, который пингует сервер... - person sjaensch; 01.11.2013
comment
Вопрос касается curl, а не wget. - person Geremia; 06.12.2017
comment
Однако wget не делает smb://. Надеюсь на ответ на curl. - person Nate; 18.04.2018
comment
@Geremia Если предложение решает основную проблему - надежную загрузку файла - почему бы не поделиться им? - person Denis Kulagin; 18.11.2018
comment
Я обнаружил, что если в запросе необходимо указать диапазон байтов, тогда wget не знает, как продолжить, и попытается повторить попытку с самого начала. - person Kotosif; 20.02.2021

Вы можете проверить код выхода в цикле while и продолжить, пока код выхода не укажет, что загрузка прошла успешно:

export ec=18; while [ $ec -eq 18 ]; do /usr/bin/curl -O -C - "http://www.example.com/a-big-archive.zip"; export ec=$?; done

Пример взят с сайта http://ilovesymposia.com/2013/04/11/automatically-resume-interrupted-downloads-in-osx-with-curl/

person Claudio Floreani    schedule 24.11.2015
comment
в моем случае curl выходит с другими кодами, поэтому вместо этого я проверяю код успеха: export ec=18; while [ $ec -ni 0 ]; do /usr/bin/curl -O -C - "http://www.example.com/a-big-archive.zip"; export ec=$?; done - person oluckyman; 10.11.2019