Jak pobierać pliki za pomocą curl

curl jest jednym z najbardziej wszechstronnych narzędzi wiersza poleceń do pobierania plików przez HTTP, HTTPS, FTP i dziesiątki innych protokołów. Niezależnie od tego, czy musisz zapisać pojedynczą odpowiedź API do pliku, czy zautomatyzować pobieranie wsadowe w skrypcie powłoki, curl ma do tego odpowiednią flagę. Ten przewodnik obejmuje każdą opcję związaną z pobieraniem — od podstawowego zapisywania plików za pomocą -o i -O, przez wznawianie przerwanych transferów za pomocą -C -, ograniczanie przepustowości za pomocą --limit-rate, aż po wyświetlanie pasków postępu. Każda flaga zawiera jasne wyjaśnienie, typowe wzorce użycia i gotowy do skopiowania przykład.

Szybki przegląd flag pobierania

-o

Zapisz wynik do nazwanego pliku zamiast na stdout

-O

Zapisz wynik do pliku o nazwie takiej jak plik zdalny

-L

Automatycznie podążaj za przekierowaniami HTTP 3xx

-C -

Kontynuuj/wznów poprzedni transfer pliku

--limit-rate

Ogranicz prędkość transferu do podanej wartości

--max-filesize

Odmów pobierania plików większych niż określony rozmiar

-J

Użyj nagłówka Content-Disposition do nazwania pliku

-#

Wyświetl postęp transferu jako prosty pasek postępu

-u

Podaj nazwę użytkownika:hasło do uwierzytelniania na serwerze

--retry

Ponów próbę transferu przy przejściowych błędach (liczba razy)

--retry-delay

Poczekaj tyle sekund między kolejnymi próbami

-T

Wyślij lokalny plik pod URL (domyślnie PUT)

--create-dirs

Twórz lokalne katalogi w razie potrzeby przy zapisywaniu wyniku

-s

Ukryj miernik postępu i komunikaty o błędach

--output-dir

Zapisz plik(i) wyjściowe w określonym katalogu (curl 7.73+)

curl -o: Zapisz pod określoną nazwą pliku

Co robi
Flaga -o (lub --output) nakazuje curl zapisanie treści odpowiedzi do wskazanego pliku. Bez niej curl wypisuje odpowiedź na stdout (twój terminal). Możesz użyć dowolnej nazwy pliku i ścieżki — curl utworzy plik lub nadpisze istniejący.
Typowe użycie
Używaj -o, gdy chcesz kontrolować dokładną nazwę pliku lub zapisywać do określonego katalogu. Działa z każdym protokołem — HTTP, HTTPS, FTP, SFTP i innymi. Połącz z -L do obsługi przekierowań i -s do cichej pracy w skryptach.
$ curl -o report.pdf https://example.com/files/report.pdf

curl -O: Zapisz z nazwą pliku ze zdalnego serwera

Co robi
Flaga -O (lub --remote-name) zapisuje pobrany plik używając nazwy wyodrębnionej z URL. Na przykład, jeśli URL kończy się na /data.csv, curl tworzy plik o nazwie data.csv w bieżącym katalogu.
Typowe użycie
Używaj -O, gdy nazwa pliku na serwerze jest znacząca i nie musisz jej zmieniać. Możesz przekazać wiele flag -O, aby pobrać kilka plików jednym poleceniem. Uwaga: jeśli URL nie zawiera nazwy pliku (np. kończy się na /), curl zakończy się niepowodzeniem — użyj -o zamiast tego.
$ curl -O https://example.com/files/data.csv

curl -L: Podążaj za przekierowaniami

Co robi
Flaga -L (lub --location) powoduje, że curl automatycznie podąża za przekierowaniami HTTP — 301 (Przeniesiono na stałe), 302 (Znaleziono), 307 i 308. Bez -L curl zwraca samą odpowiedź przekierowania zamiast właściwej treści.
Typowe użycie
Większość adresów URL do pobrania przekierowuje przynajmniej raz (np. z HTTP na HTTPS lub z krótkiego URL do właściwego pliku). Zawsze łącz -L z -o lub -O przy pobieraniu plików. Domyślnie curl podąża za maksymalnie 50 przekierowaniami; zmień to za pomocą --max-redirs.
$ curl -L -o latest.tar.gz https://github.com/user/repo/releases/latest/download/app.tar.gz

curl -C -: Wznów przerwane pobieranie

Co robi
Flaga -C - (lub --continue-at -) nakazuje curl automatyczne wykrycie rozmiaru istniejącego częściowego pliku i wznowienie pobierania od miejsca, w którym zostało przerwane. Serwer musi obsługiwać nagłówek HTTP Range.
Typowe użycie
Jeśli duże pobieranie zostało przerwane przez problem z siecią lub timeout, wystarczy ponownie uruchomić to samo polecenie z dodaną flagą -C -. curl wyśle nagłówek Range: bytes=OFFSET- i pobierze tylko pozostałe dane. Jest to niezbędne dla dużych plików przy niestabilnych połączeniach.
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zip

curl --limit-rate: Ogranicz prędkość pobierania

Co robi
Flaga --limit-rate ogranicza prędkość pobierania (i wysyłania) do określonej wartości. Akceptuje przyrostki: k lub K dla kilobajtów/s, m lub M dla megabajtów/s, g lub G dla gigabajtów/s.
Typowe użycie
Używaj --limit-rate, aby uniknąć nasycenia przepustowości przy pobieraniu dużych plików, szczególnie na współdzielonych połączeniach. Przydatne jest również do testowania, jak aplikacja radzi sobie z wolnymi odpowiedziami.
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.iso

curl --max-filesize: Przerwij, jeśli plik jest zbyt duży

Co robi
Flaga --max-filesize nakazuje curl przerwanie transferu, jeśli oczekiwany rozmiar pliku (z nagłówka Content-Length) przekracza określony limit. Rozmiar może używać przyrostków takich jak k, M, G.
Typowe użycie
Używaj w skryptach, aby zapobiec niespodziewanie dużym pobieraniom zajmującym miejsce na dysku. Pamiętaj, że nie wszystkie serwery wysyłają Content-Length — w takim przypadku curl nie może wymusić tego limitu i pobieranie przebiega normalnie.
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -J: Użyj nazwy pliku sugerowanej przez serwer

Co robi
Flaga -J (lub --remote-header-name) nakazuje curl użycie nazwy pliku określonej w nagłówku Content-Disposition serwera, zamiast wyodrębniania jej z URL. Jest to typowe dla API pobierania, które zwracają pliki ze znaczącymi nazwami.
Typowe użycie
Zawsze łącz -J z -O. Jest to przydatne, gdy URL jest punktem końcowym API (jak /export?format=csv), ale serwer zwraca właściwą nazwę pliku w nagłówkach. Uwaga dotycząca bezpieczeństwa: serwer kontroluje nazwę pliku, więc używaj tylko z zaufanymi serwerami.
$ curl -L -O -J https://example.com/api/export?format=csv

curl -#: Pokaż pasek postępu

Co robi
Flaga -# (lub --progress-bar) zastępuje domyślny szczegółowy miernik postępu prostym paskiem postępu ###. Jest to łatwiejsze do odczytania przy interaktywnym użyciu.
Typowe użycie
Używaj -# przy interaktywnym pobieraniu, gdy chcesz czysty wskaźnik postępu. W skryptach preferuj -s (cichy) lub domyślny miernik postępu. Domyślne wyjście curl już pokazuje prędkość, procent, pozostały czas i całkowity rozmiar.
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gz

Dodatkowe opcje pobierania

-u

Podaj nazwę użytkownika:hasło do uwierzytelniania na serwerze

--retry

Ponów próbę transferu przy przejściowych błędach (liczba razy)

--retry-delay

Poczekaj tyle sekund między kolejnymi próbami

-T

Wyślij lokalny plik pod URL (domyślnie PUT)

--create-dirs

Twórz lokalne katalogi w razie potrzeby przy zapisywaniu wyniku

-s

Ukryj miernik postępu i komunikaty o błędach

--output-dir

Zapisz plik(i) wyjściowe w określonym katalogu (curl 7.73+)

Praktyczne scenariusze pobierania

Te przykłady łączą wiele flag, aby obsłużyć typowe zadania pobierania, które napotkasz w codziennej pracy programistycznej i pisaniu skryptów.

Pobierz wiele plików jednocześnie

Użyj wielu flag -O, aby pobrać kilka plików jednym poleceniem. curl przetwarza je sekwencyjnie. Do równoległego pobierania użyj xargs lub GNU parallel.

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

Pobierz z serwera FTP

curl natywnie obsługuje FTP, FTPS i SFTP. Dodaj -u user:password do uwierzytelniania. Użyj -O, aby zachować zdalną nazwę pliku.

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

Pobierz z uwierzytelnianiem

Użyj -u user:pass do Basic Auth lub -H do przekazania tokena Bearer lub klucza API. Połącz z -L i -o do pełnego pobierania.

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

Niezawodne pobieranie z wznawianiem i ponownymi próbami

Połącz -C - (wznawianie), --retry (automatyczne ponowienie przy niepowodzeniu) i -L (podążanie za przekierowaniami) dla solidnych pobrań, które przetrwają przerwy w sieci.

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

Często zadawane pytania o pobieranie za pomocą curl

Jaka jest różnica między curl -o a curl -O?

-o nazwapliku zapisuje pobrany plik pod dokładną nazwą, którą podasz. -O wyodrębnia nazwę pliku z URL i jej używa. Użyj -o, gdy chcesz niestandardową nazwę lub ścieżkę; użyj -O, gdy nazwa pliku na serwerze jest odpowiednia.

Dlaczego curl pobiera pusty lub HTML-owy plik zamiast właściwego pliku?

URL prawdopodobnie zwraca przekierowanie HTTP (301 lub 302). Domyślnie curl zapisuje samą odpowiedź przekierowania — nie końcową treść. Dodaj -L, aby automatycznie podążać za przekierowaniami: curl -L -o plik URL.

Jak wznowić częściowo pobrany plik za pomocą curl?

Użyj curl -C - -o nazwapliku URL. Flaga -C - wykrywa istniejący rozmiar pliku i wysyła nagłówek Range, aby zażądać tylko pozostałych bajtów. Serwer musi obsługiwać żądania zakresu.

Jak ograniczyć prędkość pobierania w curl?

Użyj --limit-rate z wartością i przyrostkiem: curl --limit-rate 500k -o plik URL ogranicza prędkość do 500 KB/s. Przyrostki: k (KB/s), M (MB/s), G (GB/s).

Czy curl może pobrać wiele plików jednocześnie?

Tak. Użyj wielu flag -O: curl -O URL1 -O URL2 -O URL3. curl pobiera je sekwencyjnie. Do równoległego pobierania przekieruj listę URL do xargs -P 4 -I {} curl -O {}.

Jak pobrać plik wymagający uwierzytelniania?

Dla HTTP Basic Auth: curl -u user:pass -o plik URL. Dla tokenów Bearer: curl -H "Authorization: Bearer TOKEN" -o plik URL. Dla kluczy API w nagłówkach: curl -H "X-API-Key: KEY" -o plik URL.

Jak pobrać pliki z serwera FTP za pomocą curl?

Użyj curl -u user:pass -o localfile ftp://host/path/file. curl natywnie obsługuje FTP, FTPS (FTP przez TLS) i SFTP (SSH FTP). Dla anonimowego FTP pomiń -u.

Jak niezawodnie pobrać duże pliki za pomocą curl?

Połącz -C - (wznawianie przy niepowodzeniu), --retry 5 (automatyczne ponowienie), --retry-delay 10 i -L (podążanie za przekierowaniami): curl -C - --retry 5 --retry-delay 10 -L -o plik URL. To automatycznie obsługuje problemy z siecią.

Jak wyświetlić pasek postępu przy pobieraniu za pomocą curl?

Użyj curl -# -o plik URL dla prostego paska postępu. Domyślne wyjście curl już pokazuje prędkość transferu, procent i szacowany czas. W skryptach użyj -s, aby ukryć całe wyjście.

Czy mogę określić katalog pobierania w curl?

Z curl 7.73+ użyj --output-dir /path/to/dir w połączeniu z -O. Dla starszych wersji podaj pełną ścieżkę za pomocą -o /path/to/dir/filename. Dodaj --create-dirs, jeśli katalog jeszcze nie istnieje.

Czy powinienem używać curl czy wget do pobierania plików?

Oba są doskonałe. wget jest prostszy do rekurencyjnego mirrorowania stron i ma wbudowaną logikę ponawiania. curl obsługuje ponad 25 protokołów (nie tylko HTTP/FTP), jest lepszy do wywołań API i skryptów, obsługuje więcej metod uwierzytelniania i jest dostępny praktycznie na każdym systemie operacyjnym.

Jak używać curl w skrypcie bash do pobierania plików?

Użyj curl -fsSL -o plik URL: -f cicho kończy się niepowodzeniem przy błędach HTTP (nie zapisuje strony błędu), -s cichy, -S pokaż błędy nawet w trybie cichym, -L podążaj za przekierowaniami. Sprawdź kod wyjścia: if ! curl -fsSL -o file URL; then echo "Download failed"; exit 1; fi.