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

24

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

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

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

ChiperSoft
источник
1
Звучит как ошибка в OSX версии rsync.
Игнасио Васкес-Абрамс

Ответы:

4

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

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

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

LCC
источник
В конечном итоге это то, что я в итоге сделал. Я удалил всю коллекцию с NAS и снова запустил rsync, используя локально смонтированное соединение CIFS вместо демона rsync на NAS. Теперь я просто исправляю проблемы itunes из заглавных букв в именах файлов. : /
ChiperSoft
50

Вы можете использовать --iconvопцию rsync для конвертации между 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 на удаленном сервере. Содержание файлов не будет затронуто.

Леннарт Л
источник
1
Я не Оригинальный Плакат, так что это не мое дело, но это гораздо более чистое и эффективное решение, чем то, которое помечено как принятое. В ролях это точно, будет так полезно.
ItsGC
1
Отличный ответ; Я понятия не имел, что UTF8-MACстоит за НФД; при использовании с iconvсамим собой это обеспечивает общий механизм для перевода туда и обратно между NFC и NFD.
Мклемент
отличный ответ, это решает давнюю проблему синхронизации Mac с сервером Linux!
Медуз
2
На Mac вам также может понадобитьсяbrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz
Я получаюrsync: --iconv: unknown option
KMC
7

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

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

почему я
источник
0

Из моего опыта я рекомендую использовать 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
lukdz
источник