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

Fin*_*nch 75 unix curl

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

我试过了:

$ cat urls.txt | xargs -0 curl -O
Run Code Online (Sandbox Code Playgroud)

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

gho*_*oti 130

这对我有用:

$ xargs -n 1 curl -O < urls.txt
Run Code Online (Sandbox Code Playgroud)

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

请注意,这会运行顺序curls,您可能会将其视为不必要的重量.如果您想节省一些开销,以下内容可能会在bash中起作用:

$ mapfile -t urls < urls.txt
$ curl "${urls[@]/#/-O }"
Run Code Online (Sandbox Code Playgroud)

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

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

$ curl $(printf ' -O %s' $(cat urls.txt))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢你的暗示!这是在我的Mac上工作,但我更喜欢管道版本`cat urls.txt | xargs -n 1 curl -O` ;-) (4认同)

Dir*_*irk 28

一个非常简单的解决方案如下:如果你有一个'file.txt'文件

url="http://www.google.de"
url="http://www.yahoo.de"
url="http://www.bing.de"
Run Code Online (Sandbox Code Playgroud)

然后你可以使用卷曲,只需做

curl -K file.txt
Run Code Online (Sandbox Code Playgroud)

并且curl将调用file.txt中包含的所有Url!

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


小智 11

或者你可以这样做:

cat urls.txt | xargs curl -O
Run Code Online (Sandbox Code Playgroud)

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


Cir*_*四事件 8

xargs -P 10 | curl

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

xargs -P 10 -n 1 curl -O < urls.txt
Run Code Online (Sandbox Code Playgroud)

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

只是不要设置-P太高或你的RAM可能不堪重负.

GNU parallel可以实现类似的结果.

这些方法的缺点是它们不会对所有文件使用单个连接,curl如果您一次将多个URL传递给它,如下所示:

curl -O out1.txt http://exmple.com/1 -O out2.txt http://exmple.com/2
Run Code Online (Sandbox Code Playgroud)

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

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

另请参阅:使用Curl命令行实用程序进行并行下载


Ste*_*ald 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

    for i in "`cat /testcurl.txt`" ; do curl -O "$i" ; done
Run Code Online (Sandbox Code Playgroud)

确保使用后退标记(`)同时确保标志(-O)是大写O而不是零

使用-O标志,将获取原始文件名

快乐下载!

  • ^如果你不知道,不要这样做. (4认同)
  • 这是一个可怕的解决方案;它不仅为每次下载生成一个单独的进程,而且每次都必须重新建立 TCP 连接,即使在中等延迟的网络上也会浪费大量时间。 (2认同)