Як завантажувати файли за допомогою 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 (Переміщено назавжди), 302 (Знайдено), 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, щоб запросити лише решту байтів. Сервер повинен підтримувати 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.