我在名为urls.txt
的文件中有一个列表网址。每行包含1个URL。我想使用cURL一次下载所有文件。我似乎无法获得正确的单行代码。
我试过了:
$ cat urls.txt | xargs -0 curl -O
但这只给了我列表中的最后一个文件。
答案 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_MAX和MAX_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
所述也许结合两种方法会得到最好的结果?但我认为并行化比保持连接活着更重要。
答案 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