컬은 중괄호 구문을 사용하여 여러 파일을 다운로드합니다.

컬은 중괄호 구문을 사용하여 여러 파일을 다운로드합니다.

다음 구문을 통해 두 개의 파일을 다운로드하려고 합니다.

curl -O http://domain/path/to/{file1,file2}

문제는 첫 번째 파일만 실제로 로컬에 저장되고 두 번째 파일은 표준 출력으로 인쇄된다는 것입니다.

-O다음을 추가하면 제대로 작동한다는 것을 깨달았습니다 .

curl -OO http://domain/path/to/{file1,file2}

그런데 파일 개수가 너무 많아지면 실용적이지 않을까요? 예를 들어,

curl -O http://domain/path/to/file[1,100]

curl내 질문은, (올바른 번호를 추가하지 않고 ) 여러 개의 개별 파일을 한 번에 다운로드할 수 있는 방법이 정말 없는 걸까요 -O?

답변1

이 옵션은 컬이 각 파일에서 또는 를 --remote-name-all사용하는 것처럼 동작하도록 지시합니다 . 따라서 이 명령은 문제를 해결합니다.-O--remote-name

curl --remote-name-all http://domain/path/to/{file1,file2}

인용하다여기.

이 옵션은 출시 이후부터 사용 가능했습니다.버전 7.19.0

답변2

이것은 컬 7.19.0에서 구현되었습니다. @Besworks의 답변을 참조하세요.

매뉴얼 페이지에 따르면 여러 s를 사용하는 것 외에는 원래 파일 이름을 보존할 수 있는 방법이 없습니다 O. 또는 자신만의 파일 이름을 사용할 수도 있습니다.

curl http://{one,two}.site.example -o "file_#1.txt"

http://one.site.example에 저장되고 file_one.txthttp://two.site.example저장 됩니다 file_two.txt.

여러 변수가 작용할 수도 있습니다. 좋다:

curl http://{site,host}.host[1-5].example -o "#1_#2"

http://site.host1.example에 저장되는 원인 site_1, http://host.host1.example에 저장되는 원인 host_1등입니다.

답변3

여기서 문제는 쉘(아마도 BASH)이 명령을 해석하는 방식입니다 curl.

기본적으로 보면

curl -O http://domain/path/to/{file1,file2}

다음으로 확장합니다.

curl -O http://domain/path/to/file1 http://domain/path/to/file2

플래그는 -O첫 번째 인스턴스에만 적용되고 그 이후의 인스턴스에는 적용되지 않기 때문에 문제가 됩니다.

이 문제는 URL을 큰따옴표로 묶어서 해결할 수 있습니다.

curl -O "http://domain/path/to/{file1,file2}"

Curl 팀은 이를 인정했습니다.GitHub맨 페이지뿐만 아니라공식 컬 매뉴얼커밋되므로 향후 일부 셸에서 이러한 잠재적인 글로빙 동작을 반영해야 합니다.

이 실패와 해결 방법을 확인하기 위한 간단한 테스트 사례를 원한다면 두 개의 .txt 파일이 포함된 zip 파일을 다운로드해 보세요.모비딕~에서프로젝트 구텐베르크.

달리기:

curl -O https://www.gutenberg.org/files/2701/2701-{0,h}.zip

다음과 같은 응답이 제공됩니다.

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 380k 0 0:00:01 0:00:01 --:--:-- 380k Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.

(추출한 파일이 원시 텍스트인 경우 표준 출력(아마도 화면)으로 덤프됩니다.모비딕이것이 .zip 파일이 대신 사용되는 이유입니다. )

달리기:

curl -O "https://www.gutenberg.org/files/2701/2701-{0,h}.zip"

다음과 유사한 출력이 제공됩니다.

[1/2]: https://www.gutenberg.org/files/2701/2701-0.zip --> 2701-0.zip --_curl_--https://www.gutenberg.org/files/2701/2701-0.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 407k 0 0:00:01 0:00:01 --:--:-- 407k

[2/2]: https://www.gutenberg.org/files/2701/2701-h.zip --> 2701-h.zip --_curl_--https://www.gutenberg.org/files/2701/2701-h.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 522k 100 522k 0 0 1000k 0 --:--:-- --:--:-- --:--:-- 1000k

이 문제는 { }와일드카드를 사용할 때만 발생합니다. 사용되는 경우에는 [ ]큰따옴표가 필요하지 않습니다 .

참고로, wget설치된 경우 따옴표 없이 와일드카드를 처리할 수 있습니다.

달리기:

wget http://domain/path/to/{file1,file2}

두 파일이 모두 존재하면 풀다운됩니다.

달리기:

wget https://www.gutenberg.org/files/2701/2701-{0,h}.zip

curlMoby Dick zip 파일은 위의 큰따옴표 예에 따라 다운로드됩니다 .

답변4

컬을 사용하여 여러 파일을 다운로드하는 다른 방법이 있습니다.

urls="firstUrl secondUrl thirdUrl" 
for url in $urls
do
   curl -O "$url"
done

노트: 필수 공백은 서로 다른 URL을 구분하는 데 사용됩니다.

관련 정보