Ach*_*rts 7 ubuntu rsync mac-osx utf-8
我在谷歌上搜索了几个小时来为我的问题找到解决方案,但我无法让它工作:
我必须将 ext4 格式驱动器上的文件结构 rsync 到 hfs+ 格式驱动器。文件夹和文件名可以包含德语元音变音 (äöüß),并且 OS X 和 Linux 对 UTF8 的处理不同。OS X 文件系统使用 Unicode Normalization Form D (NFD),而 Linux 使用 Form C (NFC)。
这种行为会导致删除和重新同步名称中带有变音符号的文件,这会产生大量不必要的开销,尤其是当您使用该--backup
选项进行rsync 时。
防止这种行为的解决方案是使用,--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, ...
Run Code Online (Sandbox Code Playgroud)
使用自制软件的最新 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**, ...
Run Code Online (Sandbox Code Playgroud)
与我的问题相关的问答是:
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
Run Code Online (Sandbox Code Playgroud)
直到那一步一切正常。此外,我必须使用...设置共享库的路径
touch /etc/ld.so.conf.d/libiconv.conf
echo "/usr/local/lib" > /etc/ld.so.conf.d/libiconv.conf
ldconfig
Run Code Online (Sandbox Code Playgroud)
现在伪字符集也可以在 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**, ...
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是 - 它在 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]
Run Code Online (Sandbox Code Playgroud)
当我用文档测试 iconv 时,伪字符集会起作用。rsync 有什么问题?谢谢你的帮助!
归档时间: |
|
查看次数: |
881 次 |
最近记录: |