curl로 파일 다운로드하는 방법

curl은 HTTP, HTTPS, FTP 및 수십 가지 다른 프로토콜을 통해 파일을 다운로드하기 위한 가장 다재다능한 명령줄 도구 중 하나입니다. 단일 API 응답을 파일에 저장하거나 셸 스크립트에서 일괄 다운로드를 자동화하든, 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 플래그는 예상 파일 크기(Content-Length 헤더 기준)가 지정된 제한을 초과하면 전송을 중단하도록 curl에게 지시합니다. k, M, G 같은 접미사를 사용할 수 있습니다.
일반적인 사용법
스크립트에서 예상치 못한 대용량 다운로드가 디스크 공간을 소비하는 것을 방지하기 위해 사용하세요. 모든 서버가 Content-Length를 보내는 것은 아닙니다 — 그 경우 curl은 이 제한을 적용할 수 없으며 다운로드가 정상적으로 진행됩니다.
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -J: 서버가 제안한 파일명 사용

기능
-J (또는 --remote-header-name) 플래그는 URL에서 파일명을 추출하는 대신 서버의 Content-Disposition 헤더에 지정된 파일명을 사용하도록 curl에게 지시합니다. 의미 있는 이름의 파일을 반환하는 다운로드 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

인증을 사용한 다운로드

Basic Auth에는 -u user:pass를 사용하거나, Bearer 토큰 또는 API 키를 전달하기 위해 -H를 사용하세요. 완전한 다운로드를 위해 -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/s로 제한합니다. 접미사: k (KB/s), M (MB/s), G (GB/s).

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.

curl로 FTP 서버에서 파일을 다운로드하려면 어떻게 하나요?

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 호출과 스크립팅에 더 적합하며, 더 많은 인증 방법을 지원하고, 사실상 모든 운영 체제에서 사용할 수 있습니다.

bash 스크립트에서 curl을 사용하여 파일을 다운로드하려면 어떻게 하나요?

curl -fsSL -o file URL을 사용하세요: -f는 HTTP 오류 시 조용히 실패(오류 페이지 저장 안 함), -s 무음, -S 무음 모드에서도 오류 표시, -L 리다이렉트 따라가기. 종료 코드 확인: if ! curl -fsSL -o file URL; then echo "Download failed"; exit 1; fi.