CLI AI

Как докачать файл через curl, не получив битый результат

2026-06-29

Быстрая проверка — curl -sI https://example.com/big.iso | grep -i 'accept-ranges': если в ответе нет Accept-Ranges: bytes, докачка невозможна в принципе, и -C - тут не поможет. Пропустите эту проверку — и рискуете напороться на самый неприятный сценарий curl: код завершения 0, никаких тревожных сообщений и молча обрезанный файл. Дальше — как докачивать правильно, ловить этот отказ, повторять попытки и проверять, что результат действительно цел.

1. Умеет ли сервер вообще докачивать

clai
$ clai проверь, поддерживает ли сервер докачку файлов→ curl -sI https://example.com/big.iso | grep -i 'accept-ranges'

Если в ответе нет заголовка Accept-Ranges: bytes, докачка невозможна в принципе, и -C - этого не изменит. Тридцать секунд проверки экономят час боли, если обрыв случится под конец большого файла.

2. Обычная докачка

clai
$ clai докачай этот прерванный файл→ curl -C - -O https://example.com/big.iso

-C - значит «определи смещение сам по размеру локального файла». -O сохраняет под именем из URL. Если файл уже скачан целиком, curl просто скажет, что докачивать нечего.

3. Ловушка: сервер не поддерживает Range

clai
$ clai скачай файл и проверь, что он пришёл целиком→ curl -C - -o part.bin http://example.com/big.bin && cmp -s part.bin original.bin && echo intact || echo TRUNCATED

Вот ради этой строки и написана вся статья. Если сервер игнорирует Range, curl всё равно завершится с кодом 0 — без ошибки, без предупреждения — а файл останется обрезанным ровно там, где оборвался. Проверено на реальном сервере: пришло 51200 байт вместо 200000, и ни одного сообщения об ошибке нигде. Никогда не доверяйте докачанному файлу без проверки — размером, cmp или контрольной суммой.

4. Повторять, пока не докачается

clai
$ clai качай этот файл с повторами, пока не скачается целиком→ curl --retry 10 --retry-delay 5 --retry-all-errors -C - -O https://example.com/big.iso

--retry покрывает сетевые сбои, --retry-all-errors добавляет к ним и коды 5xx. В паре с -C - каждая попытка продолжает с места предыдущего обрыва, а не начинает заново.

5. Ограничить скорость, чтобы не забить канал

clai
$ clai скачай файл, но ограничь скорость одним мегабайтом в секунду→ curl --limit-rate 1M -C - -O https://example.com/big.iso

Полезно на машине, где канал нужен ещё чему-то. Принимает суффиксы k, M, G.

6. Проверить, что скачалось именно то

clai
$ clai проверь контрольную сумму только что скачанного файла→ curl -sO https://example.com/big.iso.sha256 && sha256sum -c big.iso.sha256

Последний шаг любой докачки. Совпадение контрольной суммы — единственное настоящее доказательство, что склеенный из кусков файл цел: размер может совпасть, а содержимое — нет.

Грабли

  • curl никогда не сообщает, что докачка провалилась. Код завершения 0, файл обрезан. Проверка после факта — единственная реальная защита.
  • Если файл на сервере изменился во время докачки, получите мусор. Байты старой и новой версии окажутся склеены в одном файле. При сомнении удаляйте частичный файл и качайте заново.
  • -C - вместе с -o, указывающим на файл, оставшийся от старой загрузки, — это опасно. curl докачивает то, что уже лежит по этому пути, — он смотрит только на имя файла, а не на то, откуда взялись байты.

Похожие вопросы

wget или curl? У wget -c та же логика докачки, и он проще для одного файла. curl гибче в скриптах и есть там, где wget так и не поставили.

Как докачать файл по ssh? rsync --partial --progress --append-verify — он и докачивает, и проверяет уже скачанную часть.

Что значит «bad download resume»? curl не смог продолжить с нужного смещения — сервер не поддерживает Range либо файл изменился. Начинайте с нуля.

Читайте также

Не гадайте, какие флаги curl нужны для докачки — опишите задачу, а команду напишет CliAI. Установка одной строкой.