我在一个名为的文件中有一个列表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_MAX和MAX_ARG_STRLEN.
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输出,则只需使用该参数.
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命令行实用程序进行并行下载
以下是我在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标志,将获取原始文件名
快乐下载!