Как скачивать файлы с помощью curl
curl — один из самых универсальных инструментов командной строки для скачивания файлов по HTTP, HTTPS, FTP и десяткам других протоколов. Нужно ли вам сохранить ответ API в файл или автоматизировать пакетное скачивание в shell-скрипте — у curl есть подходящий флаг. Это руководство охватывает все опции, связанные со скачиванием — от базового сохранения файлов с помощью -o и -O до возобновления прерванных загрузок с -C -, ограничения пропускной способности с --limit-rate и отображения прогресс-баров. Каждый флаг сопровождается понятным объяснением, типичными сценариями использования и готовым примером для копирования.
Краткая справка по флагам скачивания
Записать вывод в файл с указанным именем вместо stdout
Записать вывод в файл с именем, как у удалённого файла
Автоматически следовать HTTP-редиректам 3xx
Продолжить/возобновить предыдущую передачу файла
Ограничить скорость передачи до указанного значения
Отказ от скачивания файлов, превышающих указанный размер
Использовать заголовок Content-Disposition для именования файла
Показать прогресс передачи в виде простого прогресс-бара
Указать имя пользователя:пароль для аутентификации на сервере
Повторить передачу при временных ошибках (количество попыток)
Ждать указанное количество секунд между повторами
Загрузить локальный файл на URL (по умолчанию PUT)
Создавать локальные директории по мере необходимости при сохранении
Подавить индикатор прогресса и сообщения об ошибках
Сохранить файл(ы) в указанную директорию (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.pdfcurl -O: Сохранение с именем файла с сервера
- Что делает
- Флаг
-O(или--remote-name) сохраняет скачанный файл, используя имя, извлечённое из URL. Например, если URL заканчивается на/data.csv, curl создаст файл с именемdata.csvв текущей директории. - Типичное использование
- Используйте
-O, когда имя файла на сервере имеет смысл и его не нужно переименовывать. Можно передать несколько флагов-Oдля скачивания нескольких файлов одной командой. Примечание: если URL не содержит имени файла (например, заканчивается на/), curl завершится с ошибкой — используйте-oвместо этого.
$ curl -O https://example.com/files/data.csvcurl -L: Следование редиректам
- Что делает
- Флаг
-L(или--location) заставляет curl автоматически следовать HTTP-редиректам — 301 (Moved Permanently), 302 (Found), 307 и 308. Без-Lcurl возвращает сам ответ с редиректом, а не конечный контент. - Типичное использование
- Большинство 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.gzcurl -C -: Возобновление прерванных загрузок
- Что делает
- Флаг
-C -(или--continue-at -) указывает curl автоматически определить размер существующего частичного файла и возобновить загрузку с того места, где она была прервана. Сервер должен поддерживать HTTP-заголовокRangeдля работы этой функции. - Типичное использование
- Если большая загрузка была прервана из-за проблем с сетью или таймаута, просто запустите ту же команду с добавлением
-C -. curl отправит заголовокRange: bytes=OFFSET-и скачает только оставшиеся данные. Это критически важно для больших файлов при нестабильном соединении.
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zipcurl --limit-rate: Ограничение скорости скачивания
- Что делает
- Флаг
--limit-rateограничивает скорость скачивания (и загрузки) до указанного значения. Принимает суффиксы:kилиKдля килобайт/с,mилиMдля мегабайт/с,gилиGдля гигабайт/с. - Типичное использование
- Используйте
--limit-rate, чтобы не перегружать канал при скачивании больших файлов, особенно на общих подключениях. Также полезно для тестирования поведения приложения при медленных ответах.
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.isocurl --max-filesize: Отмена при слишком большом файле
- Что делает
- Флаг
--max-filesizeуказывает curl прервать передачу, если ожидаемый размер файла (из заголовкаContent-Length) превышает указанный лимит. Размер может использовать суффиксыk,M,G. - Типичное использование
- Используйте в скриптах для предотвращения неожиданно больших загрузок, которые могут заполнить диск. Обратите внимание, что не все серверы отправляют
Content-Length— в этом случае curl не может применить ограничение, и загрузка продолжится в обычном режиме.
$ curl --max-filesize 100M -o update.bin https://example.com/update.bincurl -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=csvcurl -#: Отображение прогресс-бара
- Что делает
- Флаг
-#(или--progress-bar) заменяет стандартный подробный индикатор прогресса простым прогресс-баром###. Его проще читать при интерактивной работе. - Типичное использование
- Используйте
-#при интерактивном скачивании, когда нужен чистый индикатор прогресса. Для скриптов предпочтительнее-s(тихий режим) или стандартный индикатор. Стандартный вывод curl уже показывает скорость, процент, оставшееся время и общий размер.
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gzДополнительные опции скачивания
Указать имя пользователя:пароль для аутентификации на сервере
Повторить передачу при временных ошибках (количество попыток)
Ждать указанное количество секунд между повторами
Загрузить локальный файл на URL (по умолчанию PUT)
Создавать локальные директории по мере необходимости при сохранении
Подавить индикатор прогресса и сообщения об ошибках
Сохранить файл(ы) в указанную директорию (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.