我有这个小脚本从文件中的给定列表下载图像。
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行)。有什么方法可以加快速度吗?就像将源文件拆分为单独的文件并同时运行多个wget实例一样。
答案 0 :(得分:2)
有很多方法可以解决这个问题。 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被放入后台(&amp;),因此循环的下一次迭代可以立即发生。通过这种方式,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文件的一个部分的名称。