管道输出cat到cURL以下载文件列表

时间:2012-03-26 02:18:34

标签: unix curl

我在名为urls.txt的文件中有一个列表网址。每行包含1个URL。我想使用cURL一次下载所有文件。我似乎无法获得正确的单行代码。

我试过了:

$ cat urls.txt | xargs -0 curl -O

但这只给了我列表中的最后一个文件。

6 个答案:

答案 0 :(得分:124)

这对我有用:

$ xargs -n 1 curl -O < urls.txt

我在FreeBSD。您的xargs可能会以不同的方式工作。

请注意,这会运行顺序curl,您可能会将其视为不必要的重量级。如果您想节省一些开销,以下内容可能适用于bash:

$ mapfile -t urls < urls.txt
$ curl "${urls[@]/#/-O }"

这会将您的URL列表保存到数组,然后使用curl选项扩展数组,以便下载目标。 curl命令可以获取多个URL并获取所有URL,回收现有连接(HTTP / 1.1),但在每个URL之前需要-O选项才能下载并保存< / em>每个目标。

或者如果您使用的是POSIX shell而不是bash:

$ curl $(printf ' -O %s' $(cat urls.txt))

这依赖于printf重复格式模式以消耗数据参数列表的行为;并非所有独立printf都会这样做。

请注意,此非xargs方法也可能会违反非常大的URL列表的系统限制。如果这是一个问题,请研究ARG_MAXMAX_ARG_STRLEN

答案 1 :(得分:26)

一个非常简单的解决方案如下: 如果您有一个文件&#39; file.txt&#39;像

url="http://www.google.de"
url="http://www.yahoo.de"
url="http://www.bing.de"

然后你可以使用curl并简单地做

curl -K file.txt

curl会调用file.txt中包含的所有网址!

因此,如果您可以控制输入文件格式,也许这对您来说是最简单的解决方案!

答案 2 :(得分:12)

或者你可以这样做:

cat urls.txt | xargs curl -O

如果要在命令中间插入cat输出,则只需使用-I参数。

答案 3 :(得分:8)

<强> xargs -P 10 | curl

GNU xargs -P可以并行运行多个curl进程。例如。运行10进程:

xargs -P 10 -n 1 curl -O < urls.txt

如果未达到最大下载速度且服务器没有限制IP,这将加速下载10倍,这是最常见的情况。

请勿将-P设置得过高,否则您的内存可能会不堪重负。

GNU parallel可以达到类似的效果。

这些方法的缺点是,他们不会对所有文件使用单个连接,如果您一次传递多个网址,curl会执行以下操作:

curl -O out1.txt http://exmple.com/1 -O out2.txt http://exmple.com/2

https://serverfault.com/questions/199434/how-do-i-make-curl-use-keepalive-from-the-command-line

所述

也许结合两种方法会得到最好的结果?但我认为并行化比保持连接活着更重要。

另请参阅:Parallel download using Curl command line utility

答案 4 :(得分:7)

以下是我在Mac(OSX)上的操作方法,但它在其他系统上应该同样有效:

您需要的是一个包含curl链接的文本文件

像这样:

    http://www.site1.com/subdirectory/file1-[01-15].jpg
    http://www.site1.com/subdirectory/file2-[01-15].jpg
    .
    .
    http://www.site1.com/subdirectory/file3287-[01-15].jpg

在这个假设的情况下,文本文件有3287行,每行编码15张图片。

假设我们将这些链接保存在名为testcurl.txt的文本文件中,位于硬盘的顶层(/)。

现在我们必须进入终端并在bash shell中输入以下命令:

    for i in "`cat /testcurl.txt`" ; do curl -O "$i" ; done

确保使用后退(') 还要确保标志(-O)是大写O而不是零

带有-O标志的

,将采用原始文件名

快乐下载!

答案 5 :(得分:3)

正如其他人正确提到的那样:

-cat urls.txt | xargs -0 curl -O
+cat urls.txt | xargs -n1 curl -O

然而,这个范例是一个非常糟糕的主意,特别是如果您的所有URL都来自同一台服务器 - 您不仅要生成另一个curl实例,还要建立新的TCP连接对于每个请求,这是非常低效的,对于现在无处不在的https来说更是如此。

请改用:

-cat urls.txt | xargs -n1 curl -O
+cat urls.txt | wget -i/dev/fd/0

或者,甚至更简单:

-cat urls.txt | wget -i/dev/fd/0
+wget -i/dev/fd/0 < urls.txt

最简单:

-wget -i/dev/fd/0 < urls.txt
+wget -iurls.txt