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個の画像が同時にダウンロードされます。

関連情報