复制代码

Rclone无法访问包含全角冒号(:)的文件名:原因与解决方案


今天踩了一个很奇怪的 Rclone 坑:Windows 中文文件名 + 全角冒号(:)

今天用 Rclone 上传文件时,遇到了一个非常奇怪的问题。

Windows 明明可以正常打开目录:

E:\Test\Test:1

但是:

rclone lsf "E:\Test\Test:1"

却直接提示:

directory not found

最开始我怀疑:

  • Windows 编码问题

  • Unicode 问题

  • SFTP 问题

  • Hetzner 问题

  • Rclone Bug

结果都不是。


真正原因

后来才发现,这是 Rclone 的 Filename Encoding(文件名编码)机制

为什么会有这个机制?

因为:

Linux 可以有:

Test:1.jpg

Windows 却不能。

因此,Rclone 为了让各种不同平台之间能够互相复制文件,会自动做字符映射,例如:

:(半角)
↓
:(全。下同)
?(半)
↓
?(全)
*(半)
↓
*(全)

这样 Linux 上的文件也可以保存到 Windows。这个设计本身没有问题,而且也是 Rclone 的默认行为。(Rclone)


为什么中文用户容易踩坑?

问题就在这里。

我遇到的文件名根本不是 Linux 转过来的。

而是 Windows 本地创建的,文件名本身就包含真正的中文全角标点:

Test:1.jpg

注意:

这里的:

是真正的 Unicode 全角冒号。

但是 Rclone 默认会认为:

这个全角冒号,是以前为了兼容 Windows 而转换出来的。

于是它内部又把它理解成:

:

结果:

Windows 真正存在的是:

Test:1.jpg(全)

Rclone 内部却在寻找:

Test:1.jpg(半)

当然就只能得到:

directory not found

如何解决?

最简单的方法:

--local-encoding Raw

例如:

rclone copy ... --local-encoding Raw

或者:

rclone check ... --local-encoding Raw

加入以后,Rclone 就不会再自动转换:

:
?
*

文件可以正常上传、校验、列目录。

官方文档也说明了,如果 Windows 本地本来就使用全角 ,可以使用 --local-encoding Raw,或者调整 --local-encoding 配置。(Rclone)


这算 Bug 吗?

我觉得严格来说,不算。

这是一个兼容性设计

Rclone 要兼顾:

  • Windows

  • Linux

  • macOS

  • Google Drive

  • OneDrive

  • S3

  • FTP

  • SFTP

  • WebDAV

  • ...

所以它必须有一套统一的文件名编码规则。这个编码系统从 v1.50 起就是为了让不同文件系统之间尽可能透明地传递文件名。(Reddit)

只是这个设计对于欧美用户几乎是透明的,而对于中文、日文等用户来说,由于全角标点本来就是正常文字,因此更容易遇到这种情况。


我的建议

如果你的工作流和我类似:

  • Windows

  • 中文文件名

  • YouTube / Bilibili 视频归档

  • Rclone 上传

建议把:

--local-encoding Raw

加入自己的 Rclone 命令模板。

不用修改系统环境变量,也不用改 Rclone 默认配置。

既明确,又容易维护。


今天虽然折腾了半个小时以上,但最后还是学到了一个以前完全不知道的知识点。

以后如果有人搜索:

rclone directory not found Windows 中文文件名

或者:

rclone 全角冒号

希望这篇记录能帮他少走一点弯路。

 

来自官方参考文档:https://rclone.org/overview/

https://rclone.org/local/ 

 

鄙人也会长期维护这篇文章,欢迎补充和纠正。 计划后期也会分享出我的 Rclone 上传的模板等。


评论

此博客中的热门博文

第一篇博客------关于英语学习的阶段性总结和计划

Windows 零基础使用 yt-dlp:从双击 exe 报错到下载第一个视频

关于HTTP/1.1、2、3一点浅薄的小议与图解