我试图通过以下语法下载两个文件:
curl -O http://domain/path/to/{file1,file2}
问题是只有第一个文件实际上保存在本地,第二个文件只是打印到标准输出。
我确实意识到,如果我添加一个-O
它就可以正常工作:
curl -OO http://domain/path/to/{file1,file2}
但如果文件数量变得太大,这不是不切实际吗?例如,
curl -O http://domain/path/to/file[1,100]
我的问题是,是否真的没有办法一次下载多个单独的文件curl
(不添加正确数量的-O
)?
答案1
答案2
这已在curl 7.19.0中实现。请参阅@Besworks 的回答。
根据手册页,除了使用多个 s 之外,没有办法保留原始文件名O
。或者,您可以使用自己的文件名:
curl http://{one,two}.site.example -o "file_#1.txt"
导致http://one.site.example
被保存到file_one.txt
和http://two.site.example
被保存到file_two.txt
。
多个变量甚至可以发挥作用。喜欢:
curl http://{site,host}.host[1-5].example -o "#1_#2"
导致http://site.host1.example
被保存到site_1
、http://host.host1.example
被保存到host_1
等等。
答案3
这里的问题是 shell(可能是 BASH)如何解释命令curl
。
基本上,它是在看
curl -O http://domain/path/to/{file1,file2}
并将其扩展为:
curl -O http://domain/path/to/file1 http://domain/path/to/file2
这是一个问题,因为标志-O
只应用于第一个实例,而不应用于其后的任何实例。
这可以通过双引号 url 来修复:
curl -O "http://domain/path/to/{file1,file2}"
Curl 团队已经承认了这一点GitHub以及手册页和官方卷曲手册已提交,因此它们应该在将来的某些 shell 中反映这种潜在的通配行为。
如果您想要一个简单的测试用例来查看此故障以及如何修复它,请尝试下载两个 .txt 文件的 zip莫比迪克从古腾堡计划。
跑步:
curl -O https://www.gutenberg.org/files/2701/2701-{0,h}.zip
将提供以下响应:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 380k 0 0:00:01 0:00:01 --:--:-- 380k Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.
(如果您提取的文件是原始文本,那么它只会转储到标准输出,可能是您的屏幕,这对于莫比迪克这就是为什么使用 .zip 文件来代替。)
跑步:
curl -O "https://www.gutenberg.org/files/2701/2701-{0,h}.zip"
将给出类似这样的输出:
[1/2]: https://www.gutenberg.org/files/2701/2701-0.zip --> 2701-0.zip --_curl_--https://www.gutenberg.org/files/2701/2701-0.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 407k 0 0:00:01 0:00:01 --:--:-- 407k
[2/2]: https://www.gutenberg.org/files/2701/2701-h.zip --> 2701-h.zip --_curl_--https://www.gutenberg.org/files/2701/2701-h.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 522k 100 522k 0 0 1000k 0 --:--:-- --:--:-- --:--:-- 1000k
请注意,此问题仅在{ }
用于通配符时才会出现。如果仅[ ]
使用则不需要双引号。
顺便说一句,如果wget
安装了,它可能可以处理通配符而无需引号。
跑步:
wget http://domain/path/to/{file1,file2}
将拉下这两个文件(如果它们确实存在)。
跑步:
wget https://www.gutenberg.org/files/2701/2701-{0,h}.zip
将按照上面的双引号curl
示例下载 Moby Dick zip 文件。
答案4
还有一种使用curl下载多个文件的替代方法:
urls="firstUrl secondUrl thirdUrl"
for url in $urls
do
curl -O "$url"
done
笔记:必填空格,用于分隔不同的 URL。