10

我在 OS X 上进行网站开发,并且经常发现自己将实时网站的某些部分(运行 Linux/LAMP)移动到在我自己的机器上运行的开发服务器上。一个这样的例子涉及下载图像(用户生成的内容,例如通过 ftp 下载),以一种或另一种方式处理它们,然后将它们放回生产站点。

所涉及的图像文件是在 Linux 机器中创建的,它们的文件名似乎使用 NFC 分解以 UTF-8 编码。另一方面,OS X 的 HFS+ 文件系统不允许 NFC 分解文件名并转换为 NFD。但是,一旦我完成并想要上传文件,它们的名称现在将使用 NFD 分解,因为 Linux 支持它们。因此,新上传的(在某些情况下是替换的)文件将无法通过预期的 URL 访问。

我正在寻找一种方法来在(最好)或之后(convmv看起来是一个不错的选择,但我在此服务器上没有足够的权限在这种特殊情况下是不可能的)传输期间更改文件的 UTF 分解,因为我猜这是不可能事先做的。我已经尝试使用 Transmit 和 rsync(使用通常使用的部署脚本)进行 FTP 上传,但无济于事。rsync中的--iconv选项似乎很理想,但不幸的是,我运行 rsync 2.6.9 的服务器无法识别它。

我猜很多人都有类似的问题,我很高兴听到任何解决方案或解决方法!

更新:在这种情况下,我最终将文件同步到运行 Ubuntu 的虚拟机,在那里运行 convmv,然后再次同步到我的登台服务器。虽然这工作得相当好,但它有点耗时。也许可以在 OS X 上挂载一个 ext 文件系统,然后使用它们原来的 NFC 分解文件名将文件存储在那里?

此外,为了在以后的 WordPress 安装中避免这个问题,这是我的用例,你可以在上传任何文件add_filter('sanitize_file_name', 'remove_accents'); 之前添加一个简单的,你应该没问题。

4

2 回答 2

6

这似乎rsync --iconv是最好的解决方案,因为您可以一步完成文件的传输和名称的转码。您只需要说服您的主机升级他们的 rsync。鉴于该--iconv功能是在 2008 年发布的 rsync 3.0.0 中引入的,您的主机仍在运行 rsync 2.6.9 有点奇怪。

如果您无法说服您的主机安装最新的 rsync,您可以编译自己的 rsync,将其上传~/bin到服务器上的某个位置,然后在系统安装 rsync 之前将其添加到您的路径中。然后您应该可以使用该--iconv选项。只要您使用 rsync over SSH(默认)而不是 rsync 守护程序,这应该可以工作;因为 rsync over SSH 的工作原理是通过 SSH 连接到远程计算机,并rsync --server使用传递给本地 rsync 的相同选项运行。

或者您可以找到一个安装了最新工具和 Perl 的主机。

于 2012-10-02T22:16:54.967 回答
5

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

给定 Linux 服务器和 OS X 机器:

将文件从服务器复制到机器

您应该从服务器执行此命令(它不适用于 OS X):

rsync --iconv=UTF-8,UTF-8-MAC /home/username/path/on/server/ 'username@your.ip.address.here:/Users/username/path/on/machine/'

将文件从机器复制到服务器

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

rsync --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'
于 2014-09-10T14:10:54.027 回答