Bash 루프에서 정렬된 프로세스를 최적화하는 방법은 무엇입니까?

Bash 루프에서 정렬된 프로세스를 최적화하는 방법은 무엇입니까?

많은 수의 파일을 순차적으로 다운로드하고 사용자 정의 이름을 지정하면서 다운로드하고 싶습니다.

내 코드는 다음과 같습니다

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개의 이미지가 동시에 다운로드됩니다.

관련 정보