cat的输出到cURL来下载文件列表

我有一个名为urls.txt的文件中的列表url。 每行包含1个URL。 我想用cURL一次下载所有的文件。 我似乎无法得到正确的一行。

我试过了:

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

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

这适用于我:

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

我在FreeBSD上。 你的xargs可能工作不同。

一个非常简单的解决scheme如下:如果你有一个文件“file.txt”

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

那么你可以使用curl,只需要做

 curl -K file.txt 

curl将调用您的file.txt中包含的所有url!

所以如果你能控制你的input文件格式,也许这是最简单的解决scheme!

以下是我如何在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的文本文件中。

现在我们必须进入terminal并在bash shell中input以下命令:

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

确保你使用反标(`)还要确保标志(-O)是大写的O而不是零

与-O标志,将采取原始文件名

快乐的下载!

来自GNU的xargs -P 10以最多10个线程并行地下载文件:

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

如果未达到最大下载速度,并且服务器不抑制IP(这是最常见的情况),则会加速下载10倍。

只是不要设置太高,否则你的RAM可能会被压倒。

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

这些方法的缺点是,它们不会为所有文件使用单个连接,如果您一次向多个URL传递多个URL,则会发生这种情况,如下所示:

 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

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

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

或者你可以这样做:

 cat urls.txt | xargs curl -O 

当您想要在命令中插入cat输出时,只需要使用-I参数。

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

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

然而,这种范例是一个非常糟糕的主意,特别是如果所有的URL都来自同一个服务器 – 你不仅要产生另一个curl实例,而且还将为每个请求build立一个新的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