Назад | Перейти на главную страницу

Преобразование имен файлов UTF-8 NFD в UTF-8 NFC в rsync или afpd

У меня есть домашний файловый сервер, на котором работает FreeNAS 8. Несколько дней назад я использовал rsync для загрузки всей своей библиотеки iTunes с Mac, чтобы я мог загружать свою библиотеку по сети, а не с медленного USB-накопителя. В основном это сработало, и iTunes теперь работает намного лучше, но у меня возникают проблемы с доступом к любым песням, в которых есть символы, отличные от ascii (я впервые заметил проблему при загрузке треков Queensrÿche). Файлы будут отображаться в Finder, но при любой попытке доступа к ним они исчезнут, пока я не подключусь к серверу.

После некоторого исследования я выяснил, что это потому, что OSX использует другой порядок символов UTF, чем Linux. Файловые системы OSX используют Unicode Normalization Form D (NFD), где linux использует Form C (NFC). Rsync не конвертирует эти формы, когда он выполняет копирование с моего Mac на сервер, теперь, когда iTunes пытается получить доступ к файлу со специальным символом по сети, файлы на сервере имеют неправильную кодировку, и afpd сообщает, что они не не существует.

Как лучше всего решить эту проблему? Можно ли заставить rsync выполнять преобразование Unicode при загрузке базовой библиотеки на сервер? Могу ли я настроить afpd для передачи / получения имен файлов в формате NFD? Есть ли простое решение для изменения имен файлов на сервере? Я нашел кое-что о программе с именем convmv, но не знаю, смогу ли я запустить ее на FreeNAS.

Вы можете использовать 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 на удаленном сервере. На содержимое файлов это не повлияет.

В настоящее время я использую 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/

Копирование файлов с компьютера 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/'

Примечание: Если вы используете версию 3.0.0 или новее rsync, --iconv вариант, упомянутый в других ответах, явно является лучшим решением.

Что-то, что должен работа - это синхронизация между исходным каталогом и смонтированная удаленная файловая система (SMB, NFS, AFP), которые rsync будет рассматривать как локальную файловую систему.

Однако я не знаю, насколько хорошо это работает на практике, и вам нужно обойти различные проблемы, например, алгоритм дельта-передачи не будет использоваться по умолчанию (поскольку источник и место назначения являются «локальными») (возможно - no-all-file будет работать?), вы должны проверить, например, что SMB эффективно сохраняет время модификации и т. д.

Не используйте rsync для копирования файлов на NAS. Когда вы используете rsync для копирования файлов, имена файлов будут храниться на вашем NAS в формате UTF NFD (то есть в формате OSX), но сервер Samba, работающий на вашем NAS, понимает только имена файлов в формате UTF NFC. Используйте интерфейс CIFS / SMB (Samba) для копирования файлов, и все будет хорошо.

По своему опыту я рекомендую использовать SMB вместо ssh. Iconv решает проблему с кодировкой, но все еще существует проблема с разрешенными символами в разных системах:

Исходное имя файла на Mac:

https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s

После копирования с помощью rsync через SMB:

-as seen by Mac (over SMB):     https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
-as seen by Ubuntu (over SMB):  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
-as seen by Windows10 (over SMB):   https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
-as seen by Ubuntu server locally:  https-img-9gag-fun.9cache.comphotoadK9jzN_460s

После копирования с помощью rsync через ssh (с ant без флага iconv):

-as seen by Mac (over SMB):     H0INHQ~6
-as seen by Ubuntu (over SMB):  H0INHQ~6
-as seen by Windows10 (over SMB):   H0INHQ~6
-as seen by Ubuntu server locally:  https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s