Как да изтегляте файлове с 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 KB/сек. Суфикси: k (KB/сек), M (MB/сек), G (GB/сек).

Може ли 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 over 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.