自动生成文件名功能

Lobsters Hottest 工具

摘要

本文介绍了 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、开源和网络

相似文章

文件名的Unicode组合

Lobsters Hottest

本文讨论了在Subversion版本控制系统中,不同操作系统之间Unicode文件名组合(NFC与NFD)面临的挑战,并提出了处理这些差异的解决方案。

Curl 性能

Lobsters Hottest

Daniel Stenberg 宣布为 curl 推出新的性能测试套件,自动化构建和结果公开发布在 curl.se/perf。

使用 jj 生成更好的分支名称

Lobsters Hottest

本文介绍了 jj 版本控制系统的一个模板别名,通过将提交描述转换为 slug 来生成更易读的分支名称,从而改善默认基于变更 ID 的命名方式的可用性。