많은 수의 파일을 순차적으로 다운로드하고 사용자 정의 이름을 지정하면서 다운로드하고 싶습니다.
내 코드는 다음과 같습니다
iterator=1;
while read p; do
curl "$p" -o $((iterator++)).jpg;
done < ../outProfileImages;
이것은 wget의 "입력 파일" 모드에 비해 매우 느린 것처럼 보이지만 wget을 사용하여 다운로드한 파일의 올바른 순서를 유지하면서 사용자 정의 이름에 번호를 매기는 방법을 찾을 수 없습니다.
파일의 일련번호만 포함된 맞춤 이름을 원했던 이유는 다운로드할 때 파일명이 너무 크기 때문이었는데, 파일명만 봐도 순서를 알 수 있어서 편리할 것 같았습니다.
답변1
GNU를 사용하면 xargs
다음과 같은 작업을 수행할 수 있습니다.
awk '{printf "%04d.jpg\n%s\n", NR, $0}' < ../outProfileImages |
xargs -d '\n' -rn2 -P10 curl -o
최대 10개까지 병렬로 실행합니다 curl
.
답변2
@thanasisp의 솔루션은 성능을 크게 향상시킵니다.
i=0
while read p; do
((i++))
curl -s "$p" -o "${i}.jpg" &
done < ../outProfileImages;
i
&
명령은 서브셸에서 비동기적으로 실행되므로 로 끝나는 명령 외부에 이를 추가하는 것이 중요합니다 . 따라서 i
이 증가가 백그라운드 하위 셸에서 발생하면 다음 반복에서는 업데이트된 값을 사용하지 않습니다.
답변3
GNU Parallel을 사용하면 다음과 같습니다:
parallel -j100 curl {} -o {#}.jpg < ../outProfileImages
그러면 100개의 이미지가 동시에 다운로드됩니다.