如何优化 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在以 终止的命令之外添加很重要&,因为该命令将在子 shell 中异步执行。因此i,如果此增量发生在后台的子 shell 中,则下一次迭代将不会使用更新后的值。

答案3

使用 GNU Parallel 时,它看起来像这样:

parallel -j100 curl {} -o {#}.jpg < ../outProfileImages

这将并行下载 100 张图像。

相关内容