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 上传的模板等。
评论
发表评论