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