【问题标题】:Parallel WGET download in bash scriptbash 脚本中的并行 WGET 下载
【发布时间】:2016-04-02 22:14:16
【问题描述】:

我有这个小脚本可以从文件中的给定列表下载图像。

FILE=./img-url.txt
while read line; do
url=$line
wget -N -P /images/ $url
wget -N  -P /images/ ${url%.jpg}_{001..005}.jpg
done < $FILE

问题是,它运行时间过长(文件中 > 5000 行)。有什么办法可以加快速度吗?就像将源 txt 拆分为单独的文件并同时运行多个 wget 实例。

【问题讨论】:

标签: bash wget


【解决方案1】:

有很多方法可以解决这个问题。 GNU Parallel 将是最通用的解决方案,但考虑到您提出问题的方式,是的,将文件拆分为多个部分并同时在每个部分上运行脚本。将文件分成多少块是一个有趣的问题。 100 件意味着同时产生 100 个 wget 进程。几乎所有这些都会闲置,而极少数会利用所有网络带宽。据我所知,一个进程可能会使用一个小时的所有带宽,但我猜测一个很好的折衷方案是将文件拆分为四个文件,因此 4 个 wget 进程同时运行。我将调用您的脚本 geturls.sh。在命令行中输入。

split -l 4 img-url.txt
for f in xaa xab xac xad; do
    ./geturls.sh $f &
done

这会将您的文件分成四个〜偶数部分。拆分命令输出文件默认给出一些平淡无奇的文件名,在本例中为 xaa、xab 等。for 循环获取这些文件的名称并将它们作为命令行参数提供给 geturl.sh,这是程序名称后的命令行。 geturls.sh 被放入后台 (&),因此循环的下一次迭代可以立即发生。这样,geturls.sh 几乎同时在文件的所有四个部分上运行,因此您有 4 个 wget 进程同时运行。

geturls.sh的内容是

#!/bin/bash
FILE=$1
while read line; do
url=$line
wget -N -P /images/ $url
wget -N  -P /images/ ${url%.jpg}_{001..005}.jpg
done < $FILE

我对您的代码所做的唯一更改是对 shell 的显式声明(主要是出于习惯),并且现在为 FILE 分配了 $1 变量中的值。回想一下,$1 是(第一个)命令行参数,这里是您的 img-url.txt 文件的一部分的名称。

【讨论】:

  • 完美,但 -l 开关在您的代码中应该是 -n 开关。我无法编辑您代码中的一个字符。
  • 还有一个问题:脚本最后没有退出。我应该把“exit 0”命令放在哪里?我在完成之前尝试过(两者),但没有帮助。
  • 似乎 -n 和 -l 会做同样的事情,但我会相信你的话。 :) “exit 0”命令是多余的。如果脚本到达底部,则默认假设是它正确完成。但是如果有一些非零退出状态,你会想知道它。所以设置exit 0 ...我想不出一个很好的理由。我的意思是,如果有一些问题,那么设置 exit 0 会掩盖它。如果可能,您总是希望退出状态传达一些有用的信息。这并不总是那么容易。但是每次都将其设置为单个值会消除这种可能性。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2018-08-24
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多