我在Google上search了几个小时,find了解决scheme,但却无法解决问题。
我必须rsync ext4格式的驱动器上的文件结构到一个hfs +格式的驱动器。 文件夹和文件名可以包含德语变音(UTM),OS X和Linux之间UTF8的处理是不同的。 OS X文件系统使用Unicode规范化表单D(NFD),其中Linux使用表单C(NFC)。
这种行为会导致在名称中删除和重新同步Umlauts中的文件,这会产生很大的不必要开销,特别是如果使用--backup选项进行rsync时。
防止这种行为的解决scheme是使用--iconv=UTF8,UTF8-MAC但是这只适用于Mac上新的iconvlib 。 Ubuntu 14.04上的实际iconvlib不支持伪字符集UTF8-MAC:
root@ubuntu:~/wartung# iconv -l ... UTF-7, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE, UTF16LE, UTF32, UTF32BE, UTF32LE, ...
从自制软件的最新的rsync的OS X做到这一点:
bash-3.2$ iconv -l ANSI_X3.4-1968 ANSI_X3.4-1986 ASCII CP367 IBM367 ISO-IR-6 ISO646-US ISO_646.IRV:1991 US US-ASCII CSASCII UTF-8 UTF8 **UTF-8-MAC UTF8-MAC**, ...
相关的问题和我的问题是:
Mac上的rsync –iconv选项不起作用(从远程Linux服务器同步到本地Mac)
使用rsync或afpd将UTF-8 NFD文件名转换为UTF-8 NFC
编辑
随着一些摆弄我可以重新编译Ubuntu的libiconv:
sudo -i # Get the libiconv sources wget https://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz tar -xzvf ./libiconv-1.14.tar.gz -C /usr/src && cd /usr/src/libiconv-1.14 # Get the patch for the Makefile wget https://raw.githubusercontent.com/Homebrew/patches/9be2793af/libiconv/patch-Makefile.devel patch -p1 ./Makefile.devel < patch-Makefile.devel # Get the patch for the translation file wget https://raw.githubusercontent.com/Homebrew/patches/9be2793af/libiconv/patch-utf8mac.diff patch -p1 < ./patch-utf8mac.diff # Replace utf8mac.h file rm lib/utf8mac.h && cd lib wget http://opensource.apple.com/source/libiconv/libiconv-9/libiconv/lib/utf8mac.h?txt -O utf8mac.h # Append flags.h with utf8mac echo "#define ei_utf8mac_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO)" >> flags.h # Edit stdio.h.in to prevent gcc errors because of insecure 'gets' function cd ../srclib sed -i -- 's/(gets/(fgets/g' ./stdio.in.h # compile & install ... cd .. ./configure make -f ./Makefile.devel make checkinstall
直到这一步,一切运作良好。 此外,我必须设置path共享库与…
touch /etc/ld.so.conf.d/libiconv.conf echo "/usr/local/lib" > /etc/ld.so.conf.d/libiconv.conf ldconfig
现在在Ubuntu也可以使用伪字符集:
root@ubuntu:/# iconv -l ANSI_X3.4-1968 ANSI_X3.4-1986 ASCII CP367 IBM367 ISO-IR-6 ISO646-US ISO_646.IRV:1991 US US-ASCII CSASCII UTF-8 **UTF-8-MAC UTF8-MAC**, ...
但令人惊喜的是 – 它不是在rsync?中可用!
root@ubuntu:/# rsync --iconv=UTF8,UTF8-MAC --force --ignore-errors --delete --numeric-ids --archive --hard-links --sparse --backup --backup-dir=/path/to/TEMP/ /path/SOURCE/ /path/TARGET/ iconv_open("UTF-8", "UTF8-MAC") failed rsync error: requested action not supported (code 4) at rsync.c(121) [Receiver=3.1.0] rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0]
当我用文档testingiconv时,伪字符集就起作用了。 什么是错误的rsync? 感谢您的帮助!