Как скачивать файлы с помощью curl

curl — один из самых универсальных инструментов командной строки для скачивания файлов по HTTP, HTTPS, FTP и десяткам других протоколов. Нужно ли вам сохранить ответ API в файл или автоматизировать пакетное скачивание в shell-скрипте — у curl есть подходящий флаг. Это руководство охватывает все опции, связанные со скачиванием — от базового сохранения файлов с помощью -o и -O до возобновления прерванных загрузок с -C -, ограничения пропускной способности с --limit-rate и отображения прогресс-баров. Каждый флаг сопровождается понятным объяснением, типичными сценариями использования и готовым примером для копирования.

Краткая справка по флагам скачивания

-o

Записать вывод в файл с указанным именем вместо stdout

-O

Записать вывод в файл с именем, как у удалённого файла

-L

Автоматически следовать HTTP-редиректам 3xx

-C -

Продолжить/возобновить предыдущую передачу файла

--limit-rate

Ограничить скорость передачи до указанного значения

--max-filesize

Отказ от скачивания файлов, превышающих указанный размер

-J

Использовать заголовок Content-Disposition для именования файла

-#

Показать прогресс передачи в виде простого прогресс-бара

-u

Указать имя пользователя:пароль для аутентификации на сервере

--retry

Повторить передачу при временных ошибках (количество попыток)

--retry-delay

Ждать указанное количество секунд между повторами

-T

Загрузить локальный файл на URL (по умолчанию PUT)

--create-dirs

Создавать локальные директории по мере необходимости при сохранении

-s

Подавить индикатор прогресса и сообщения об ошибках

--output-dir

Сохранить файл(ы) в указанную директорию (curl 7.73+)

curl -o: Сохранение с указанным именем файла

Что делает
Флаг -o (или --output) указывает curl сохранить тело ответа в файл, который вы укажете. Без него curl выводит ответ в stdout (ваш терминал). Можно использовать любое имя файла и путь — curl создаст файл или перезапишет существующий.
Типичное использование
Используйте -o, когда нужно контролировать точное имя файла или сохранить в определённую директорию. Работает с любым протоколом — HTTP, HTTPS, FTP, SFTP и другими. Комбинируйте с -L для обработки редиректов и -s для тихого режима в скриптах.
$ curl -o report.pdf https://example.com/files/report.pdf

curl -O: Сохранение с именем файла с сервера

Что делает
Флаг -O (или --remote-name) сохраняет скачанный файл, используя имя, извлечённое из URL. Например, если URL заканчивается на /data.csv, curl создаст файл с именем data.csv в текущей директории.
Типичное использование
Используйте -O, когда имя файла на сервере имеет смысл и его не нужно переименовывать. Можно передать несколько флагов -O для скачивания нескольких файлов одной командой. Примечание: если URL не содержит имени файла (например, заканчивается на /), curl завершится с ошибкой — используйте -o вместо этого.
$ curl -O https://example.com/files/data.csv

curl -L: Следование редиректам

Что делает
Флаг -L (или --location) заставляет curl автоматически следовать HTTP-редиректам — 301 (Moved Permanently), 302 (Found), 307 и 308. Без -L curl возвращает сам ответ с редиректом, а не конечный контент.
Типичное использование
Большинство URL для скачивания выполняют хотя бы один редирект (например, с HTTP на HTTPS или с короткого URL на реальный файл). Всегда комбинируйте -L с -o или -O при скачивании файлов. По умолчанию curl следует до 50 редиректов; это можно изменить с помощью --max-redirs.
$ curl -L -o latest.tar.gz https://github.com/user/repo/releases/latest/download/app.tar.gz

curl -C -: Возобновление прерванных загрузок

Что делает
Флаг -C - (или --continue-at -) указывает curl автоматически определить размер существующего частичного файла и возобновить загрузку с того места, где она была прервана. Сервер должен поддерживать HTTP-заголовок Range для работы этой функции.
Типичное использование
Если большая загрузка была прервана из-за проблем с сетью или таймаута, просто запустите ту же команду с добавлением -C -. curl отправит заголовок Range: bytes=OFFSET- и скачает только оставшиеся данные. Это критически важно для больших файлов при нестабильном соединении.
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zip

curl --limit-rate: Ограничение скорости скачивания

Что делает
Флаг --limit-rate ограничивает скорость скачивания (и загрузки) до указанного значения. Принимает суффиксы: k или K для килобайт/с, m или M для мегабайт/с, g или G для гигабайт/с.
Типичное использование
Используйте --limit-rate, чтобы не перегружать канал при скачивании больших файлов, особенно на общих подключениях. Также полезно для тестирования поведения приложения при медленных ответах.
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.iso

curl --max-filesize: Отмена при слишком большом файле

Что делает
Флаг --max-filesize указывает curl прервать передачу, если ожидаемый размер файла (из заголовка Content-Length) превышает указанный лимит. Размер может использовать суффиксы k, M, G.
Типичное использование
Используйте в скриптах для предотвращения неожиданно больших загрузок, которые могут заполнить диск. Обратите внимание, что не все серверы отправляют Content-Length — в этом случае curl не может применить ограничение, и загрузка продолжится в обычном режиме.
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -J: Использование имени файла, предложенного сервером

Что делает
Флаг -J (или --remote-header-name) указывает curl использовать имя файла из заголовка Content-Disposition сервера, а не извлекать его из URL. Это типично для API-загрузок, возвращающих файлы с осмысленными именами.
Типичное использование
Всегда комбинируйте -J с -O. Это полезно, когда URL является API-эндпоинтом (например, /export?format=csv), но сервер возвращает правильное имя файла в заголовках. Примечание по безопасности: имя файла контролируется сервером, поэтому используйте только с доверенными серверами.
$ curl -L -O -J https://example.com/api/export?format=csv

curl -#: Отображение прогресс-бара

Что делает
Флаг -# (или --progress-bar) заменяет стандартный подробный индикатор прогресса простым прогресс-баром ###. Его проще читать при интерактивной работе.
Типичное использование
Используйте -# при интерактивном скачивании, когда нужен чистый индикатор прогресса. Для скриптов предпочтительнее -s (тихий режим) или стандартный индикатор. Стандартный вывод curl уже показывает скорость, процент, оставшееся время и общий размер.
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gz

Дополнительные опции скачивания

-u

Указать имя пользователя:пароль для аутентификации на сервере

--retry

Повторить передачу при временных ошибках (количество попыток)

--retry-delay

Ждать указанное количество секунд между повторами

-T

Загрузить локальный файл на URL (по умолчанию PUT)

--create-dirs

Создавать локальные директории по мере необходимости при сохранении

-s

Подавить индикатор прогресса и сообщения об ошибках

--output-dir

Сохранить файл(ы) в указанную директорию (curl 7.73+)

Практические сценарии скачивания

Эти примеры комбинируют несколько флагов для решения типичных задач скачивания, с которыми вы столкнётесь в повседневной разработке и написании скриптов.

Скачивание нескольких файлов одновременно

Используйте несколько флагов -O для скачивания нескольких файлов одной командой. curl обрабатывает их последовательно. Для параллельного скачивания используйте xargs или GNU parallel.

$ curl -O https://example.com/file1.txt -O https://example.com/file2.txt -O https://example.com/file3.txt

Скачивание с FTP-сервера

curl поддерживает FTP, FTPS и SFTP нативно. Добавьте -u user:password для аутентифицированного доступа. Используйте -O для сохранения с именем файла на сервере.

$ curl -u user:pass -o backup.sql ftp://ftp.example.com/db/backup.sql

Скачивание с аутентификацией

Используйте -u user:pass для Basic Auth или -H для передачи Bearer-токена или API-ключа. Комбинируйте с -L и -o для полноценного скачивания.

$ curl -H "Authorization: Bearer eyJhbGciOi..." -L -o data.json https://api.example.com/export

Надёжное скачивание с возобновлением и повторами

Комбинируйте -C - (возобновление), --retry (автоматический повтор при ошибке) и -L (следование редиректам) для надёжных загрузок, переживающих сетевые сбои.

$ curl -C - --retry 5 --retry-delay 10 -L -o largefile.zip https://cdn.example.com/largefile.zip

Часто задаваемые вопросы о скачивании с curl

В чём разница между curl -o и curl -O?

-o filename сохраняет файл с точным именем, которое вы укажете. -O извлекает имя файла из URL и использует его. Используйте -o, когда нужно своё имя или путь; используйте -O, когда имя файла на сервере подходит.

Почему curl скачивает пустой файл или HTML вместо нужного файла?

URL, вероятно, возвращает HTTP-редирект (301 или 302). По умолчанию curl сохраняет сам ответ с редиректом, а не конечное содержимое. Добавьте -L для автоматического следования редиректам: curl -L -o file URL.

Как возобновить частично скачанный файл с помощью curl?

Используйте curl -C - -o filename URL. Флаг -C - определяет размер существующего файла и отправляет заголовок Range для запроса только оставшихся байтов. Сервер должен поддерживать запросы диапазонов для работы этой функции.

Как ограничить скорость скачивания в curl?

Используйте --limit-rate со значением и суффиксом: curl --limit-rate 500k -o file URL ограничивает скорость до 500 КБ/с. Суффиксы: k (КБ/с), M (МБ/с), G (ГБ/с).

Может ли curl скачать несколько файлов сразу?

Да. Используйте несколько флагов -O: curl -O URL1 -O URL2 -O URL3. curl скачивает их последовательно. Для параллельного скачивания передайте список URL в xargs -P 4 -I {} curl -O {}.

Как скачать файл, требующий аутентификации?

Для HTTP Basic Auth: curl -u user:pass -o file URL. Для Bearer-токенов: curl -H "Authorization: Bearer TOKEN" -o file URL. Для API-ключей в заголовках: curl -H "X-API-Key: KEY" -o file URL.

Как скачать файлы с FTP-сервера с помощью curl?

Используйте curl -u user:pass -o localfile ftp://host/path/file. curl нативно поддерживает FTP, FTPS (FTP поверх TLS) и SFTP (SSH FTP). Для анонимного FTP опустите -u.

Как надёжно скачивать большие файлы с curl?

Комбинируйте -C - (возобновление при ошибке), --retry 5 (автоповтор), --retry-delay 10 и -L (следование редиректам): curl -C - --retry 5 --retry-delay 10 -L -o file URL. Это автоматически обрабатывает сбои сети.

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

Используйте curl -# -o file URL для простого прогресс-бара. Стандартный вывод curl уже показывает скорость передачи, процент и расчётное время. Для скриптов используйте -s для подавления вывода.

Можно ли указать директорию для скачивания в curl?

В curl 7.73+ используйте --output-dir /path/to/dir в сочетании с -O. Для более старых версий укажите полный путь с помощью -o /path/to/dir/filename. Добавьте --create-dirs, если директория ещё не существует.

Что лучше использовать для скачивания файлов — curl или wget?

Оба инструмента отличные. wget проще для рекурсивного зеркалирования сайтов и имеет встроенную логику повторов. curl поддерживает более 25 протоколов (не только HTTP/FTP), лучше подходит для API-запросов и скриптов, поддерживает больше методов аутентификации и доступен практически в любой операционной системе.

Как использовать curl в bash-скрипте для скачивания файлов?

Используйте curl -fsSL -o file URL: -f тихо завершается при HTTP-ошибках (без сохранения страницы ошибки), -s тихий режим, -S показывает ошибки даже в тихом режиме, -L следует редиректам. Проверяйте код возврата: if ! curl -fsSL -o file URL; then echo "Download failed"; exit 1; fi.