curl命令行工具即将在8.10.0版本中迎来一项实用改进。对于经常使用-O(--remote-name)参数下载文件的用户来说,这个变化值得关注:当URL中没有文件名部分时,curl将不再直接报错,而是会尝试自动生成一个文件名来保存下载内容。
这是curl 8.10.0新特性系列介绍的第四篇。作为最常用的命令行选项之一,-O参数的作用是让curl根据URL中的文件名部分,在本地创建同名文件来保存下载数据。例如执行curl -O https://example.com/file.html,就会在当前目录生成一个file.html文件。
![]()
这一功能自1998年3月curl首次发布时就已支持。关键点在于,文件名完全取自URL,用户能清楚预知会创建什么文件,远程服务器不参与命名过程。
无文件名URL的困境
并非所有URL都包含文件名部分。像http://example.com/、http://example.com/path/、http://example.com/one/two/?id=12345这类地址,就没有明确的文件名。过去遇到这种情况,curl会直接拒绝使用-O参数并返回错误信息:
curl: Remote filename has no lengthcurl: (23) Failed writing received data to disk/application
8.10.0的改进方案
从8.10.0版本开始,curl会多尝试几步来为下载内容确定文件名。具体逻辑如下:
- 如果URL中有文件名部分,照旧使用该文件名。
- 如果URL没有文件名但有路径,则提取路径中最右侧的目录名作为文件名。
- 如果URL既没有文件名也没有路径,curl会使用一个固定的默认文件名curl_response作为最终兜底方案。
这个默认文件名特意不带扩展名。因为curl无法预知将要下载的数据类型,如果加上扩展名,可能会误导用户对内容类型的判断。
为什么不选index.html
有不少人建议用index.html作为默认文件名会更合理。但curl项目维护者并不认同这一观点:下载的内容完全可能是图片或开源项目的压缩包,命名为index.html反而比中性的curl_response更具误导性。
为了直观展示新逻辑,以下是使用curl -O时,不同URL对应的文件名示例:
如何确认实际使用的文件名
用户可以通过curl的-w(--write-out)参数配合%{filename_effective}变量,来查看实际使用了哪个文件名。
自定义文件名的替代方案
如果不想让curl自动决定文件名,始终可以使用-o(小写o)参数来指定任意你喜欢的文件名。
另外需要提醒的是,curl默认会覆盖(clobber)已存在的同名文件。如果希望避免覆盖行为,可以考虑使用其他相关选项来保护已有文件。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.