自动生成文件名功能
摘要
本文介绍了 curl 8.10.0 中的一项新功能,当使用 -O 选项处理无显式文件名的 URL 时,该功能会自动生成本地文件名,从而提升了命令行易用性。
<p><a href="https://lobste.rs/s/xftgtd/filename_when_none_exists">评论</a></p>
查看缓存全文
缓存时间: 2026/08/19 08:32
# 当文件名不存在时
来源:https://daniel.haxx.se/blog/2024/08/19/a-filename-when-none-exists/
这是关于即将发布的curl 8.10.0新特性的迷你系列的第四集。
curl命令行中最常用的选项之一是 *大写O*(`-O`),其长格式也称为 *双横线remote-name*(`--remote-name`)。
该选项告诉curl在下载时使用所提供URL中的文件名部分创建一个本地文件。例如,当你告诉curl
```
curl -O https://example.com/file.html
```
此命令会方便地创建一个名为`file.html`的本地文件,并将下载的数据保存在其中。
自1998年3月curl首次发布以来,-O选项就一直支持此功能。这里的一个重要点是,它从URL中选取名称,以便用户可以知道它创建了什么文件名。没有意外。远程服务器不参与命名。
## 没有文件名的场景怎么办?
URL不一定需要有文件名部分。像这些例子:
```
http://example.com/http://example.com/path/http://example.com/one/two/?id=12345
```
由于这些URL中没有文件名部分,它们过去会导致curl拒绝使用-O操作,而是返回错误。curl无法创建本地文件名来使用:
```
$ curl -O http://example.com/
curl: Remote filename has no length
curl: (23) Failed writing received data to disk/application
```
## 更努力地尝试
从curl 8.10.0开始,当使用-O时,curl会更努力地为存储下载内容生成一个文件名。虽然URL中没有文件名部分,但用户*确实*要求curl将URL下载到本地文件,因此它现在尝试几个额外步骤:
1. 如果URL中有文件名部分,则像以前一样使用它。
2. 如果没有文件名但URL中提供了*路径*,则从URL中提取最右边的目录名作为文件名使用。
3. 如果URL中既没有文件名也没有路径,curl将使用*默认的*、固定的文件名作为最终后备:`curl_response`。这个名称故意没有扩展名,因为curl不知道即将来的是什么数据,使用扩展名可能会误导用户认为它表示了内容的类型。
有些人坚持认为`index.html`是更好且合理的默认文件名。我无法同意,因为它可能是一张图片或你最喜欢的开源项目的tarball。我认为将这样的文件命名为*index.html*比简单地使用中性的*curl_response*更具误导性。
让我给你一个小表格,展示在使用curl -O和给定的一组URL时将使用哪些文件名:
**URL** | **本地文件名**
--- | ---
`http://example.com/one.html` | `one.html`
`http://example.com/one.html?clues=no` | `one.html`(curl忽略查询部分)
`http://example.com/one/two/?id=42` | `two`(因为它是目录路径中最右边的部分)
`http://example.com/path/` | `path`(因为它是目录路径中最右边的部分)
`http://example.com/` | `curl_response`(因为没有文件名或目录可用)
## 查看使用了哪个名称
你可以使用curl的-w、--write-out (https://everything.curl.dev/usingcurl/verbose/writeout.html)选项及其`%{filename_effective}`变量,来确切了解使用了哪个名称。
## 想使用其他名称?
始终有`-o`(小写o)选项允许你指定任何你喜欢的文件名。你*不必*让curl为你选择文件名。
## 是否覆盖
默认情况下,curl会覆盖(如果你愿意,也可以称为*覆盖*)任何先前存在的同名文件。如果你更希望curl采取更谨慎的方法,考虑在你的命令行中使用--no-clobber (https://curl.se/docs/manpage.html#--no-clobber)。它使curl在准备将数据下载到本地文件时,如果所选文件名已存在,则选择一个替代文件名。
## 后续导航
## curl、开源和网络
相似文章
@venturetwins:我用Claude Opus 4.8来重命名一个文件
一位用户开玩笑说,他用强大的Claude Opus 4.8 AI模型来完成重命名文件这样的简单任务。
文件名的Unicode组合
本文讨论了在Subversion版本控制系统中,不同操作系统之间Unicode文件名组合(NFC与NFD)面临的挑战,并提出了处理这些差异的解决方案。
Curl 性能
Daniel Stenberg 宣布为 curl 推出新的性能测试套件,自动化构建和结果公开发布在 curl.se/perf。
使用 jj 生成更好的分支名称
本文介绍了 jj 版本控制系统的一个模板别名,通过将提交描述转换为 slug 来生成更易读的分支名称,从而改善默认基于变更 ID 的命名方式的可用性。
@Wauplin: `hf upload` 已完全重写!单次哈希、多提交、可续传上传。相同 CLI,更快、更简洁...
Hugging Face CLI 的 `hf upload` 命令已完全重写,采用了单次哈希、多提交和可续传上传功能,版本 1.20.0 现已发布,速度更快、代码更简洁。