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