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

Chi*_*oft 27 afp rsync mac-osx utf-8 freenas

我有一个运行 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 上运行它。

小智 54

您可以使用 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/
Run Code Online (Sandbox Code Playgroud)

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

  • 我不是原始海报,所以这不取决于我,但这是一种比标记为已接受的解决方案更干净、更高效的解决方案。加星标肯定会非常有用。 (2认同)
  • 在 Mac 上,您可能还需要 `brew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash` (2认同)

Env*_*vek 7

目前我是这样使用的rsync --iconv

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

您应该从 OS X 机器执行此命令:

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 'username@server.ip.address.here:/home/username/path/on/server/' /Users/username/path/on/machine/
Run Code Online (Sandbox Code Playgroud)

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

您应该从 OS X 机器执行此命令:

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'
Run Code Online (Sandbox Code Playgroud)


LCC*_*LCC 4

\n

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

\n
\n\n

应该起作用的是源目录和已安装的远程文件系统(SMB、NFS、AFP)之间的 rsync,rsync 将仅将其视为本地文件系统。

\n\n

但是,我不知道这在实践中效果如何,并且您必须解决不同的问题,例如默认情况下不会使用增量传输算法\xe2\x80\x99(因为源和目标是\xe2\x80) \x9clocal\xe2\x80\x9d) (也许 --no-whole-file 会起作用?),你必须检查,例如,SMB 是否有效地保留了修改时间等。

\n