IT TIP

cat의 출력을 cURL로 파이프하여 파일 목록을 다운로드합니다.

itqueen 2020. 10. 25. 13:26
반응형

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을 가져 와서 모든 URL을 가져 와서 기존 연결 (HTTP / 1.1)을 재활용 할 수 있지만 각 대상 -O다운로드하고 저장하려면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

https://serverfault.com/questions/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 개의 그림을 코딩합니다.

Let's say we save these links in a text file called testcurl.txt on the top level (/) of our hard drive.

Now we have to go into the terminal and enter the following command in the bash shell:

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

Make sure you are using back ticks (`) Also make sure the flag (-O) is a capital O and NOT a zero

with the -O flag, the original filename will be taken

Happy downloading!


As others have rightly mentioned:

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

However, this paradigm is a very bad idea, especially if all of your URLs come from the same server -- you're not only going to be spawning another curl instance, but will also be establishing a new TCP connection for each request, which is highly inefficient, and even more so with the now ubiquitous https.

Please use this instead:

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

Or, even simpler:

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

Simplest yet:

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

참고URL : https://stackoverflow.com/questions/9865866/pipe-output-of-cat-to-curl-to-download-a-list-of-files

반응형