如何将cURL输出保存到文件中?

698

我有一个文本文档,其中包含一堆格式类似于以下的URL:

URL = "sitehere.com"

我想要做的是运行curl -K myfile.txt命令,并将cURL返回的响应输出到文件中。

我该如何实现这个目标?


47
该命令的作用是下载http://one.example.comhttp://two.example.com的内容,并将它们分别保存为文件名为file_one.txtfile_two.txt的本地文件。具体使用方法如下:curl http://{one,two}.example.com -o "file_#1.txt" - onmyway133
11个回答

959
curl -K myconfig.txt -o output.txt 

将收到的第一个输出写入您指定的文件中(如果存在旧文件,则覆盖)。
curl -K myconfig.txt >> output.txt

将您收到的所有输出追加到指定的文件中。
注意:-K 是可选的。
如果您要发布到类似于 https://example.org/?foo=1&baz=4 的 URL,则需要在 URL 周围加上双引号。
curl -X POST -H "Content-Type: application/octet-stream" --data-binary "@/home/path/file.xyz" "https://xample.org:8080/v1/?filename=file.xyz&food=1&z=bee" >out.txt 2>err.txt

1
抱歉,也许我需要澄清一下 - 包含所有格式为about的URL的文档名为myfile.txt,因此我运行curl -K myfile.txt并遍历每个URL,但是我没有将输出写入任何文件中。 - Tony
45
我会为我的命令行使用重定向:curl url > destfile.x - kodybrown
8
无论我选择哪种方式,输出仍然在终端显示,而不是文件中。 - kris
21
@kris 你可能在网址中使用了“&”符号。请将网址用双引号括起来再尝试。 - jglouie
没有-K也可以工作。但是加了-K之后,会出现“未指定URL”的错误。 - Arya Pourtabatabaie
显示剩余2条评论

283

对于单个文件,您可以使用-O而不是-o filename来使用URL路径的最后一段作为文件名。例如:

对于单个文件,您可以使用-O而不是-o filename来使用URL路径的最后一段作为文件名。例如:

curl http://example.com/folder/big-file.iso -O

将结果保存到当前文件夹中名为big-file.iso的新文件中。以这种方式,它类似于wget,但允许您指定其他curl选项,这些选项在使用wget时不可用。


8
如果需要处理多个文件,请使用--remote-name-all选项。参考链接:https://unix.stackexchange.com/a/265819/171025 - qwr
1
要跟随重定向,请添加“-L”选项。 - lk_vc
1
qwr 的评论又有了一个补充:参数需要放在 URL 之前,例如 curl --remote-name-all https://example.tld/resource{1,2,3}。详情请参见:https://curl.se/docs/manpage.html#--remote-name-all - Little_Ye233
正是我所需要的,这个不错且有用的-O选项。谢谢! - BiBi
1
-这是一个“字母O”(而不是零),意思是“输出”。 - Abdull

76
有几种选项可以将curl的输出保存到文件中。
# saves it to myfile.txt
curl http://www.example.com/data.txt -o myfile.txt

# The #1 will get substituted with the url, so the filename contains the url
curl http://www.example.com/data.txt -o "file_#1.txt" 

# saves to data.txt, the filename extracted from the URL
curl http://www.example.com/data.txt -O 

# saves to filename determined by the Content-Disposition header sent by the server.
curl http://www.example.com/data.txt -O -J 

19

在这种情况下,可以使用curlwget。这三个命令都能够完成相同的任务,即下载位于 http://path/to/file.txt 的文件并将其保存到本地的 "my_file.txt"。

请注意,在以下所有命令中,我也建议使用curl-L--location选项,以便跟随HTML 302重定向到文件的新位置(如果已移动)。wget无需额外的选项即可自动执行此操作。

# save the file locally as my_file.txt

wget http://path/to/file.txt -O my_file.txt  # my favorite--it has a progress bar
curl -L http://path/to/file.txt -o my_file.txt
curl -L http://path/to/file.txt > my_file.txt

或者,要将文件保存为与远程文件名相同的本地文件,请使用wgetcurl配合-O--remote-name选项。
# save the file locally as file.txt

wget http://path/to/file.txt
curl -LO http://path/to/file.txt
curl -L --remote-name http://path/to/file.txt

注意上面所有命令中的-O都是大写字母"O"。 wget命令的好处是它会显示一个漂亮的进度条。
你可以通过比较它们的sha512哈希值来证明上述3种技术下载的文件完全相同。在运行上述每个命令后,运行sha512sum my_file.txt并比较结果,可以发现这3个文件具有完全相同的sha哈希值(sha校验和),这意味着这些文件是完全相同的,逐字节比对。
参考资料:
  1. 我在这里了解到了使用curl-L选项:有没有办法用命令行cURL跟随重定向?
另请参阅:wget命令下载文件并保存为不同的文件名

7
对于希望将cURL输出复制到剪贴板而不是输出到文件的用户,您可以使用管道符“|”后面跟着pbcopy命令。
例如:curl https://www.google.com/robots.txt | pbcopy。这将把给定URL的所有内容复制到您的剪贴板中。
Linux版本:curl https://www.google.com/robots.txt | xclip Windows版本:curl https://www.google.com/robots.txt | clip

pbcopy仅适用于MacOS。但是,对于Linux,请使用xclip替代请参见此问题。但在大多数情况下,我更喜欢curl http://example.com -o example_com.html&cat example_com.html | pbcopy。这样,如果您无意中清除了剪贴板,您就不需要再次curl。 - lacostenycoder
如果您不确定有效载荷的大小,则应谨慎使用此功能。例如,您可能不想将其粘贴到文本编辑器中,但在vim中打开它没有问题。 curl http://www.textfiles.com/etext/FICTION/fielding-history-243.txt | pbcopy也许不要尝试这个! - lacostenycoder

6

如果没有在 "URL" -o "file_output" 之间添加引号,curl 将无法识别 URL 或文本文件名。

格式

curl "url" -o filename

示例

curl "https://en.wikipedia.org/wiki/Quotation_mark" -o output_file.txt

示例_2

curl "https://en.wikipedia.org/wiki/Quotation_mark" > output_file.txt  

一定要记得加上引号。


1
谢谢。我找了一段时间才找到你的评论。现在,我不再需要看着59MB的文本在屏幕上滚动而不知所措了 :-) - Spuggiehawk

4
使用--trace-ascii output.txt命令将curl的详细信息输出到文件output.txt中。

谢谢,man页面提到这也输出了“描述信息”,就像-vv显示的一样(SSL信息,HTTP动词,头文件等),我想要存储它。其他答案都没有将其写入文件。 - Thor Galle

3
如果你想将输出存储到你的桌面上,请使用以下命令,在git bash中使用post命令。这对我很有效。
curl https://localhost:8080
    --request POST 
    --header "Content-Type: application/json" 
    -o "C:\Desktop\test.json"

1

可能有点晚了,但我认为OP在寻找类似以下内容的东西:

curl -K myfile.txt --trace-ascii output.txt

0
我最喜欢的是lwp-download,可以在这里找到:https://metacpan.org/dist/libwww-perl/view/bin/lwp-download 你可以像这样使用它:
lwp-download http://www.perl.com/CPAN/src/latest.tar.gz

这将把文件存储为"latest.tar.gz"在您当前的目录中,所以不需要进一步的选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接