Mac 上的 rsync --iconv 选项不起作用(从远程 Linux 服务器同步到本地 Mac)

Mac 上的 rsync --iconv 选项不起作用(从远程 Linux 服务器同步到本地 Mac)

我想使用 rsync 将数据从远程 Linux 服务器备份到本地 Mac。我想在本地 Mac 上初始化此操作。一切正常,但有一个特殊字符问题:每次我重新运行 rsync 操作(初始同步后),带有特殊字符的文件都会先被删除,然后重新同步。据我所知,不同的字符集存在问题,首选解决方案似乎是使用该--iconv选项:

您可以使用 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。文件的内容不会受到影响。

问题是,这对我来说只能“单向”工作,即从 Mac 同步到 Linux。但我想“反向操作”,即从 Linux 机器同步到 Mac。我想从本地 Mac 初始化操作。但当我尝试时:

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

我收到一个错误:

iconv_open("UTF-8", "utf-8-mac") failed
rsync error: requested action not supported (code 4) at rsync.c(118) [sender=3.0.9]
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1]

我不知道为什么这不起作用。我的 Mac 上的 rsync 版本从 2.6.9 更新到 3.1.1。使用麦克波特。请注意,当我(在 Mac 上,请注意)启动从 Mac 到 Linux 的 rsync 时,操作即可正常工作:

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

但是从 Mac 上反过来做——这也是我想要做的——却行不通。

奇怪的是,测试从 Linux 机器启动同步会出现以下奇怪的消息:

rsync: on remote machine: --iconv=UTF-8-MAC: unknown option
rsync error: syntax or usage error (code 1) at /SourceCache/rsync/rsync-45/rsync/main.c(1333) [server=2.6.9]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

包括,请注意,非常奇怪的说法[server=2.6.9],尽管我在 Mac 上已更新到 3.1.1。出于某些原因,看起来我的 Linux 机器在 Mac 上只“看到”原始的 rsync 版本。

关于如何解决这个问题有什么建议吗?

10 月 23 日更新:根据@Lee Johnson 的出色建议(见下文),现在可以从 Linux 服务器启动同步。为了完整起见,我现在已经尝试了所有组合,并出现了一个有趣的模式:

在MAC上:

WORKS:将文件从 Mac 传输到 Linux

失败:文件从 Linux 到 Mac

在 Linux 上

WORKS:将文件从 Linux 传输到 Mac

失败:文件从 Mac 到 Linux

换句话说,该--iconv选项似乎只能以一种方式工作,即文件从本地计算机传输到远程计算机,而不是反过来。在我看来,这似乎是一个错误,但也许这就是它应该工作的方式?

有人能分享一下这方面的内容吗?

答案1

经过大量的实验,并且非常感谢@Lee Johnson 的帮助建议,我终于找到了解决方案,现在我觉得这个解决方案显而易见。在研究这个问题时,我读到的一条评论让我感到很尴尬,我以为你应该按转换顺序指定字符集;但这似乎不是正确的语法。相反,应该

总是--iconv=utf-8-mac,utf-8在从 mac 初始化 rsync 时使用,并且总是--iconv=utf-8,utf-8-mac在从 linux 机器初始化 rsync 时使用,无论我想从 mac 还是 linux 机器同步文件。

然后它就像魔术一样起作用!

答案2

您最近升级到 OS X Yosemite 了吗?我遇到了同样的问题,后来我才想起我已经将 /usr/bin/rsync 更新为 3.1 版。当我升级到 Yosemite 时,它​​被替换为旧的 2.6.9 版。

就我自己的情况而言,我通过将 3.1 rsync 重新链接回 /usr/bin 来解决了 Mac 上的问题:

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit

答案3

我在 Intel Arch Mac OS Big Sur 上解决此问题的方法:

使用以下命令安装 rsync 新版本brew

$brew install rsync

显示 rsync 路径列表:

$rsync list rsync

/usr/local/Cellar/rsync/3.2.3/bin/rsync
/usr/local/Cellar/rsync/3.2.3/bin/rsync-ssl
/usr/local/Cellar/rsync/3.2.3/share/man/ (3 files)

备份旧版本二进制命令链接:

$mv /usr/local/bin/rsync /usr/local/bin/rsync2

制作新版本二进制命令链接:

$ln -s /usr/local/Cellar/rsync/3.2.3/bin/rsync /usr/local/bin/rsync

相关内容