AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 397420
Accepted
ChiperSoft
ChiperSoft
Asked: 2012-06-11 15:09:31 +0800 CST2012-06-11 15:09:31 +0800 CST 2012-06-11 15:09:31 +0800 CST

在 rsync 或 afpd 中将 UTF-8 NFD 文件名转换为 UTF-8 NFC

  • 772

我有一个运行 FreeNAS 8 的家庭文件服务器。几天前,我使用 rsync 从 Mac 上传我的整个 iTunes 库,这样我就可以通过网络加载我的库,而不是从一个慢速 USB 驱动器上加载。这主要是有效的,iTunes 现在运行得更好,但是我在访问任何包含非 ascii 字符的歌曲时遇到了问题(我在加载 Queensrÿche 曲目时首先注意到了这个问题)。这些文件会显示在 Finder 中,但任何访问它们的尝试都会使它们消失,直到我重新连接到服务器。

经过一些研究,我发现这是因为 OSX 使用与 Linux 不同的 UTF 字符顺序。OSX 文件系统使用 Unicode Normalization Form D (NFD),而 linux 使用 Form C (NFC)。Rsync 在执行从我的 mac 到服务器的复制时不会转换这些形式,现在当 iTunes 尝试通过网络访问具有特殊字符的文件时,服务器上的文件编码错误并且 afpd 报告它们没有不存在。

解决此问题的最佳方法是什么?是否可以让rsync在将基础库上传到服务器的同时进行unicode转换?我可以将 afpd 配置为传输/接收 NFD 格式的文件名吗?有没有简单的解决方案来更改服务器上的文件名?我找到了一些关于名为 convmv 的程序的资料,但我不知道我是否可以在 FreeNAS 上运行它。

mac-osx rsync afp utf-8 truenas
  • 5 5 个回答
  • 17486 Views

5 个回答

  • Voted
  1. Lennart L
    2012-09-14T10:18:43+08:002012-09-14T10:18:43+08:00

    您可以使用 rsync 的--iconv选项在 UTF-8 NFC 和 NFD 之间进行转换,至少如果您使用的是 Mac。有一个特殊的utf-8-mac字符集代表UTF-8 NFD。因此,要将文件从 Mac 复制到 NAS,您需要运行如下命令:

    rsync -a --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
    

    这会将所有本地文件名从 UTF-8 NFD 转换为远程服务器上的 UTF-8 NFC。文件的内容不会受到影响。

    • 57
  2. Envek
    2014-09-11T06:13:06+08:002014-09-11T06:13:06+08:00

    目前我正在使用rsync --iconv这样的:

    将文件从 Linux 服务器复制到 OS X 机器

    你应该从 OS X 机器上执行这个命令:

    rsync -a --delete --iconv=UTF-8-MAC,UTF-8 '[email protected]:/home/username/path/on/server/' /Users/username/path/on/machine/
    

    将文件从 OS X 机器复制到 Linux 服务器

    你应该从 OS X 机器上执行这个命令:

    rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ '[email protected]:/home/username/path/on/server/'
    
    • 7
  3. Best Answer
    LCC
    2012-07-14T02:30:49+08:002012-07-14T02:30:49+08:00

    注意:如果您使用的是 3.0.0 或更高版本的 rsync,--iconv则其他答案中提到的选项显然是更好的解决方案。

    应该起作用的是在源目录和挂载的远程文件系统(SMB、NFS、AFP)之间进行 rsync,rsync 只会将其视为本地文件系统。

    然而,我不知道这在实践中的效果如何,你必须解决不同的问题,例如默认情况下不会使用增量传输算法(因为源和目标是“本地”)(也许—— no-whole-file 会起作用吗?),你必须检查,例如,SMB 有效地保留了修改时间等。

    • 4
  4. whyme
    2012-06-29T22:21:43+08:002012-06-29T22:21:43+08:00

    不要使用 rsync 将文件复制到您的 NAS。当您使用 rsync 复制文件时,文件名将以 UTF NFD 格式(即 OSX 格式)存储在您的 NAS 上,但在您的 NAS 上运行的 Samba 服务器只能理解 UTF NFC 格式的文件名。使用CIFS/SMB(Samba)接口复制文件,一切正常。

    • 1
  5. lukdz
    2018-05-06T23:42:34+08:002018-05-06T23:42:34+08:00

    根据我的经验,我建议使用 SMB 而不是 ssh。Iconv 解决了编码问题,但在不同系统上仍然存在允许字符问题:

    Mac 上的原始文件名:

    https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
    

    通过 SMB 上的 rsync 复制后:

    -as seen by Mac (over SMB):     https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
    -as seen by Ubuntu (over SMB):  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
    -as seen by Windows10 (over SMB):   https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
    -as seen by Ubuntu server locally:  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
    

    通过 rsync 通过 ssh 复制后(使用没有 iconv 标志的 ant):

    -as seen by Mac (over SMB):     H0INHQ~6
    -as seen by Ubuntu (over SMB):  H0INHQ~6
    -as seen by Windows10 (over SMB):   H0INHQ~6
    -as seen by Ubuntu server locally:  https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s
    
    • 0

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • 登录网络用户帐户 (Open Directory) 时,Adobe Reader 不会启动

  • 如何在客户端计算机上阻止 Finder 的“记住此密码”?

  • 如何在 Mac OS X 中正确安装 Subversion?

  • 随行人员通过 VPN 连接到 Exchange 2007

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve