我想下载大量文件,同时按顺序下载它们并为其分配自定义名称。
我的代码是这样的:
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 张图像。