2

Я ищу команду оболочки, которая надежно гарантирует, что файл полностью загружен, но избегает повторной загрузки чего-либо без необходимости. Вот псевдокод того, на что я надеюсь:

If file doesn't exist, download it.
If file exists:
    use HTTP HEAD to get timestamp and size of remote file.
    if remote timestamp is newer, delete local file and download remote file
    if timestamps are the same:
        if remote size is greater than local size:
            resume download
        if remote size is equal to local size:
            do nothing
        if remote size is less than local size:
            do nothing but issue a warning because this is weird

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

wget -N позволяет избежать загрузки файла, если временная метка удаленного файла не новее локальной. Но он не знает, были ли переводы прерваны и, следовательно, ничего не будет делать при повторном вызове при прерванной передаче.

curl -C - загрузит файл, если его нет, и возобновит его, если загрузит только частично. Но если полностью загруженный файл присутствует, он выдает мне ошибки о том, что сервер не поддерживает байтовые диапазоны.

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

1 ответ1

2

Вы можете использовать флаг -c wget даже если вы еще не начали скачивать файл. Это должно работать для вашей цели:

while ! wget -qc $url; do :; done

Это бесконечный цикл, пока wget завершится успешно. Если файл частично загружен, цикл продолжается, и wget продолжается с того места, где он остановился.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .