bash 脚本中的并行 WGET 下载
Parallel WGET download in bash script
我有这个小脚本可以从文件中的给定列表下载图像。
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 实例。
有很多方法可以解决这个问题。 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
这会将您的文件分成四块。默认情况下,split 命令输出文件会给出一些平淡无奇的文件名,在本例中为 xaa、xab 等。for 循环获取这些部分的名称并将它们作为命令行参数提供给 geturl.sh,第一件事在程序名称后的命令行上。 geturls.sh 被置于后台 (&),因此循环的下一次迭代可以立即发生。通过这种方式,geturls.sh 几乎同时在文件的所有四个部分上 运行,因此您有 4 个 wget 进程同时运行。
geturls.sh的内容是
#!/bin/bash
FILE=
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 文件中的一个片段的名称。
我有这个小脚本可以从文件中的给定列表下载图像。
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 实例。
有很多方法可以解决这个问题。 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
这会将您的文件分成四块。默认情况下,split 命令输出文件会给出一些平淡无奇的文件名,在本例中为 xaa、xab 等。for 循环获取这些部分的名称并将它们作为命令行参数提供给 geturl.sh,第一件事在程序名称后的命令行上。 geturls.sh 被置于后台 (&),因此循环的下一次迭代可以立即发生。通过这种方式,geturls.sh 几乎同时在文件的所有四个部分上 运行,因此您有 4 个 wget 进程同时运行。
geturls.sh的内容是
#!/bin/bash
FILE=
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 文件中的一个片段的名称。