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