Linux命令 – 用wget进行并行下载

评论 0 浏览 0 2019-10-07

1.概述

在本教程中,我们将使用一个简单的工具wget并行下载多个文件

本文中使用的命令是在bash中测试的,但在其他符合POSIX标准的shell中也应该可以工作。

2.用wget下载文件

wget下载文件是相当直截了当的。

wget https://my.website.com/archive.zip

遗憾的是,我们一次只能下载一个文件。

我们不得不求助于shell脚本,以便在一个命令中下载多个文件。

#!/bin/bash
while read file; do
    wget ${file}
done < files.txt

在这里,files.txt包含所有必须下载的文件,每个文件都在自己的行中。

https://my.website.com/archive-1.zip
https://my.website.com/archive-2.zip
https://my.website.com/archive-3.zip

然而,这种方法的问题是,文件是按顺序下载的。我们可能会通过并行下载文件来加速事情的进展。

3.用wget进行并行下载

我们可以通过不同的方式让wget并行下载文件。

3.1.Bash方法

一个简单而又有点天真的方法是使用&-操作符将wget进程发送到后台。

#!/bin/bash
while read file; do
    wget ${file} &
done < files.txt

wget的每次调用都会被分叉到后台,并在自己独立的子shell中异步运行。

虽然我们现在是并行下载文件,但这种方法也不是没有缺点的。例如,对完成或失败的下载没有反馈。另外,我们无法控制一次执行多少个进程。

3.2.让wget 叉开它自己

我们可以做得更好一些,通过传递-b作为参数,让wget将自己分叉到后台。

#!/bin/bash
while read file; do
    wget ${file} -b
done < files.txt

就像&-operator一样,每个调用都被分叉到后台并异步运行。但不同的是,-b参数还为我们为每次下载制作了一个日志文件。我们可以grep这些日志文件来检查是否有错误发生。

3.3.使用xargs

解决我们问题的最复杂、最干净的方法是使用xargsxargs命令接受一个参数列表,并将这些参数传递给一个选择的实用程序,有可能并行运行多个进程。

最重要的是,它使我们能够控制在任何给定时间内同时运行的最大数量的进程。

例如,我们可以为files.txt中的每一行调用wget,最多可以有两个进程并行。

#!/bin/bash
cat files.txt | xargs -n 1 -P 2 wget -q

我们还将wget设置为安静(-q)。如果不这样做,xargs会把所有进程的输出重定向到stdout,这将使我们的终端瞬间变得杂乱。相反,我们可以依靠xargs‘的返回代码。如果没有发生错误,它将以0的值退出,否则以1的值退出。

4.总结

正如我们所看到的,有不同的方式,我们可以使用wget下载多个文件,并行下载。

xargs命令也为这个问题提供了最简洁的解决方案;它在脚本中相当有用,因为它提供了适量的控制,并有一个简洁的退出代码。

最后更新2022-11-30
0 个评论
标签