我们的大多数计算机都运行 Ubuntu,但其中两台计算机双启动到 Windows,当我们有客人来访时,他们通常也运行 Windows 计算机。因此,除了使用 NFS 之外,我们的文件服务器(Ubuntu 服务器)还运行 Samba。
由于我们主要使用 Ubuntu,因此我们喜欢利用它相对于 Windows 的优势,例如能够\:*?"<>|
在文件名中使用字符。当然,问题是 Windows 不接受文件名中的这些字符,因此 Samba 必须将文件名转换为更可接受的字符。然而,我发现它这样做的方式很令人讨厌。
Episode 182 - Exorcist 2: The Heretic.mp4
例如,文件名变成了E4Q82R~Y.MP4
。这是一个糟糕的“更正”。有没有办法让 Samba 的乱序处理对人类更友好一点?是否可以将其“更正”为类似的东西Episode 182 - Exorcist 2_ The Heretic.mp4
,其中非法字符被简单地替换?
答案1
mangled map
现已弃用,并且在新版本的 Samba 中不再起作用。
您可以使用vfs_catia解决问题。将以下行添加到 smb.conf:
vfs objects = catia
catia:mappings = 0x003a:0x2236,0x003f:0x0294,0x002a:0x2217,0x003c:0x276e,0x003e:0x276f,0x0022:0x02ba,0x007c:0x2223,0x005c:0x29f9
映射以 0x 为前缀的十六进制字符代码指定,并以冒号分隔。提供的映射会将非法字符重新映射到不太可能在任何语言中使用的 unicode 相似字符。
:?* < >“| \
∶ ʔ ∗ ❮ ❯ ʺ ∣ ⧹
代码可以放在下面[global]
或单独的[share]
部分中。将其放在[global]
可能会影响性能。
请注意,您映射到的任何字符都不能用于服务器上的文件名,否则它们将无法访问。
file❮name.txt
例如:Windows 客户端访问服务器上名为的文件时,file<name.txt
由于映射关系,会向服务器发出请求,从而导致文件未找到错误。
答案2
在此链接您可以看到 mangling 选项。我认为首先您应该禁用该选项:
mangled names
之后我想名字应该看起来会更好......
要替换冒号,例如使用这一行:
mangled map =(: _)
您可以添加更多替换规则,如下所示:
mangled map =(: _) (foo bar)
(也用 bar 替换任何出现的 foo)
答案3
较新的 POSIX 客户端(至少是 Linux 和 macOS)不需要手动进行字符映射,而是可以与服务器相互协作,因此带有 NTFS 保留字符的文件名就可以正常工作。Samba 文档以及手册页:
在服务器上(参见man vfs_fruit
):
vfs objects = catia fruit
fruit:encoding = native
在客户端上,可能需要使用mapposix
* 选项进行挂载(请参阅man mount.cifs
)。
*这好像是mapchars
应该是正确的选择,但经过测试,mapposix
是有效的。