[unix] cat의 출력을 cURL로 파이프하여 파일 목록 다운로드

라는 파일에 목록 URL이 있습니다 urls.txt. 각 줄에는 1 개의 URL이 있습니다. cURL을 사용하여 한 번에 모든 파일을 다운로드하고 싶습니다. 나는 올바른 한 줄을 내리지 못하는 것 같습니다.

나는 시도했다 :

$ cat urls.txt | xargs -0 curl -O

그러나 그것은 목록의 마지막 파일만을 제공합니다.



답변

이것은 나를 위해 작동합니다.

$ xargs -n 1 curl -O < urls.txt

저는 FreeBSD에 있습니다. xargs가 다르게 작동 할 수 있습니다.

이것은 curl불필요하게 무겁게 보일 수있는 순차적 인 s를 실행 합니다. 그 오버 헤드의 일부를 저장하려면 bash에서 다음이 작동 할 수 있습니다.

$ mapfile -t urls < urls.txt
$ curl ${urls[@]/#/-O }

이렇게하면 URL 목록이 어레이에 저장되고 curl대상이 다운로드 되도록 하는 옵션이있는 어레이가 확장됩니다 . 이 curl명령은 여러 URL을 가져 와서 모두 가져 와서 기존 연결 (HTTP / 1.1)을 재활용 할 수 있지만 각 대상 -O다운로드하고 저장하려면 각 URL 앞에 옵션 이 필요합니다 . 일부 URL 내의 문자]는 셸과 상호 작용하지 않도록 이스케이프 처리해야 할 수 있습니다.

또는 bash가 아닌 POSIX 쉘을 사용하는 경우 :

$ curl $(printf ' -O %s' $(cat urls.txt))

이는 printf데이터 인수 목록을 소진하기 위해 형식 패턴을 반복하는의 동작에 의존합니다 . 모든 독립 실행 형 printf이이 작업을 수행하는 것은 아닙니다 .

이 xargs가 아닌 방법은 매우 큰 URL 목록에 대한 시스템 제한을 초과 할 수도 있습니다. 이것이 우려되는 경우 ARG_MAXMAX_ARG_STRLEN을 조사하십시오 .


답변

매우 간단한 해결책은 다음과 같습니다. ‘file.txt’파일이있는 경우

url="http://www.google.de"
url="http://www.yahoo.de"
url="http://www.bing.de"

그런 다음 curl을 사용하고 간단히

curl -K file.txt

그리고 curl은 file.txt에 포함 된 모든 URL을 호출합니다!

따라서 입력 파일 형식을 제어 할 수 있다면 이것이 가장 간단한 솔루션 일 것입니다!


답변

또는 다음과 같이 할 수 있습니다.

cat urls.txt | xargs curl -O

-I명령 중간에 cat 출력을 삽입하려는 경우 에만 매개 변수 를 사용하면 됩니다.


답변

xargs -P 10 | curl

GNU xargs -P는 여러 curl프로세스를 병렬로 실행할 수 있습니다 . 예 : 10프로세스 실행 :

xargs -P 10 -n 1 curl -O < urls.txt

이렇게하면 최대 다운로드 속도에 도달하지 않고 서버가 가장 일반적인 시나리오 인 IP를 제한하지 않는 경우 다운로드 속도가 10 배 빨라집니다.

-P너무 높게 설정하지 마십시오. 그렇지 않으면 RAM이 압도 될 수 있습니다.

GNU parallel는 비슷한 결과를 얻을 수 있습니다.

이러한 방법의 단점은 모든 파일에 대해 단일 연결을 사용하지 않는다는 것 curl입니다. 다음과 같이 여러 URL을 한 번에 전달하면 어떻게됩니까?

curl -O out1.txt http://exmple.com/1 -O out2.txt http://exmple.com/2

/server/199434/how-do-i-make-curl-use-keepalive-from-the-command-line 에서 언급했듯이

두 가지 방법을 결합하면 최상의 결과를 얻을 수 있습니까? 하지만 병렬화가 연결을 유지하는 것보다 더 중요하다고 생각합니다.

참고 항목 : Curl 명령 줄 유틸리티를 사용한 병렬 다운로드


답변

다음은 Mac (OSX)에서 수행하는 방법이지만 다른 시스템에서도 똑같이 잘 작동합니다.

필요한 것은 curl에 대한 링크가 포함 된 텍스트 파일입니다.

이렇게 :

    http://www.site1.com/subdirectory/file1-[01-15].jpg
    http://www.site1.com/subdirectory/file2-[01-15].jpg
    .
    .
    http://www.site1.com/subdirectory/file3287-[01-15].jpg

이 가상의 경우 텍스트 파일에는 3287 줄이 있고 각 줄은 15 개의 그림을 코딩합니다.

이러한 링크를 하드 드라이브의 최상위 레벨 (/)에있는 testcurl.txt라는 텍스트 파일에 저장한다고 가정 해 보겠습니다.

이제 터미널로 이동하여 bash 쉘에 다음 명령을 입력해야합니다.

    for i in "`cat /testcurl.txt`" ; do curl -O "$i" ; done

백틱 (`)을 사용하고 있는지 확인하십시오. 또한 플래그 (-O)가 대문자 O이고 0이 아닌지 확인하십시오.

-O 플래그를 사용하면 원래 파일 이름이 사용됩니다.

즐거운 다운로드 되세요!


답변

다른 사람들이 올바르게 언급했듯이 :

-cat urls.txt | xargs -0 curl -O
+cat urls.txt | xargs -n1 curl -O

그러나이 패러다임은 특히 모든 URL이 동일한 서버에서 온 경우 매우 나쁜 생각입니다. 매우 비효율적이며 현재 유비쿼터스 https에서는 훨씬 더 그렇습니다.

대신 이것을 사용하십시오 :

-cat urls.txt | xargs -n1 curl -O
+cat urls.txt | wget -i/dev/fd/0

또는 더 간단합니다.

-cat urls.txt | wget -i/dev/fd/0
+wget -i/dev/fd/0 < urls.txt

가장 간단하지만 :

-wget -i/dev/fd/0 < urls.txt
+wget -iurls.txt


답변