Параметр rsync --iconv на Mac не працює (синхронізація з віддаленого сервера Linux на локальний Mac)


9

Я хочу використовувати rsync для резервного копіювання даних з віддаленого сервера Linux на мій локальний Mac. І я хочу ініціалізувати цю операцію на своєму локальному Mac. Все працює добре, за винятком особливих проблем із символами: кожен раз, коли я повторно запускаю операцію rsync (після початкової синхронізації), файли зі спеціальними символами спочатку видаляються, а потім повторно синхронізуються. Наскільки я розумію, існує проблема з різними наборами символів, і кращим рішенням, здається, є використання --iconvпараметра:

Для перетворення між UTF-8 NFC та NFD ви можете використовувати опцію rsync --iconv, принаймні, якщо ви працюєте на 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 на віддаленому сервері. На вміст файлів це не вплине.

Проблема полягає в тому, що для мене це працює лише в один спосіб, а саме при синхронізації з Mac до Linux. Але я хочу "піти іншим шляхом", тобто синхронізувати з машини Linux на Mac. І я хочу ініціалізувати операцію зі свого локального Mac. Але коли я намагаюся:

rsync -av --delete --iconv=utf-8,utf-8-mac mynas:remotedir/ localdir/

Я отримую помилку:

iconv_open("UTF-8", "utf-8-mac") failed
rsync error: requested action not supported (code 4) at rsync.c(118) [sender=3.0.9]
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1]

Я втрачаю розуміння, чому це не працює. Моя версія rsync на Mac оновлюється з 2.6.9. до 3.1.1. за допомогою Macports . Зауважте, що операція працює тоді, коли я (на Mac, nota bene) ініціюю rsync ІЗ Mac TO Linux:

rsync -av --delete --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/

Але йти іншим шляхом 'від mac - що я хочу зробити - не виходить.

Як не дивно, тестування для запуску синхронізації з машини Linux передає це дивне повідомлення:

rsync: on remote machine: --iconv=UTF-8-MAC: unknown option
rsync error: syntax or usage error (code 1) at /SourceCache/rsync/rsync-45/rsync/main.c(1333) [server=2.6.9]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

в тому числі, зауважте, дуже дивне твердження [server=2.6.9], хоча я оновив до 3.1.1 на Mac. З деяких причин, схоже, моя машина Linux "бачить" лише оригінальну версію rsync на Mac.

Будь-яка пропозиція, як це вирішити?

ОНОВЛЕННЯ 23 жовтня : відмінна пропозиція Per @Lee Johnson (див. Нижче), ініціювання синхронізації з Linux-сервера зараз працює. Для повноти я зараз спробував усі комбінації, і вийшов цікавий візерунок:

ON MAC:

РОБОТИ: Файли з Mac на Linux

ПОМИЛКИ: Файли з Linux на Mac

ON LINUX

РОБОТИ: Файли з Linux на Mac

ПОМИЛИ: Файли з Mac на Linux

Іншими словами, --iconvваріант, здається, працює лише в один бік, з файлами з локальної машини на віддалений, а не навпаки. Мені це схоже на помилку, але, можливо, саме так ПОДАЧАЙТЕ працювати?

Хтось може поділитися світлом на цьому?


1
при використанні rsyncна mac користувальницького (наприклад, з homebrew) та виклику його з linux, потрібно вказати правильний шлях за допомогою--rsync-path="/usr/local/bin/rsync"
meduz

Я виключав .DS_Storeіз синхронізації, і через це OSX не міг видалити каталоги з цими файлами всередині. Я налаштовував набори символів з --iconv, шлях rsync на mac з --rsync-path(я використовую домашню мову), а потім повинен був додати --delete-excludedтак, щоб вперті каталоги можна було видалити.
Даніель

Відповіді:


12

Після багатьох експериментів, і дуже завдяки корисним пропозиціям @Lee Johnson, я нарешті знайшов рішення, яке зараз вважає мене бентежно очевидним. Завдяки коментарю, який я прочитав під час дослідження проблеми, я думав, що ви повинні вказати набір символів у порядку перетворення; але здається, що це не правильний синтаксис. Швидше, слід

ЗАВЖДИ використовуйте, --iconv=utf-8-mac,utf-8коли ініціалізує rsync з mac, а ВИНАГІ використовуйте --iconv=utf-8,utf-8-macпри ініціалізації rsync з машини Linux, незалежно від того, чи хочу я синхронізувати файли з машини mac чи linux.

Тоді це працює як магія!


UTF8-MAC - це псевдосхема, і вона сама по собі недоступна з iconvlib в системі Linux, навіть не з останньою версією 3.1.1 в Ubuntu 14.04 LTS. Це не працює, якщо ви спробуєте ініціювати синхронізацію в Linux.
Ахім Ламмертс

5

Ви нещодавно оновили до OS X Yosemite? У мене була така ж проблема, перш ніж я згадав, що я оновив / usr / bin / rsync з версією 3.1. Коли я перейшов до Yosemite, це було замінено на стару версію 2.6.9.

У своєму власному випадку я вирішив проблему на Mac, повернувши 3.1 rsync назад у / usr / bin:

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit

Дякую мільйон, що вирішує таємницю, чому я отримав це 2.6.9. повідомлення. (На моєму Mac, хоча встановлена ​​версія Macport знаходиться в / opt / local / bin / rsync, але зміна посилання на цей спорт працювала магічно.) На жаль, я хочу ініціалізувати синхронізацію з моєї машини MAC, тому це лише допомагає мені, наскільки я розумію, що моя машина Linux може зрозуміти, що робити. То чому він не працює, коли ініціалізується з мого Mac? Тобто, "rsync -av --delete --iconv = utf-8, utf-8-mac mynas: remotedir / localdir /"
Нік Швед

Дозвольте також сказати, що, на жаль, у мене занадто низька репутація, щоб можна було поставити +1 вашій корисній відповіді, і оскільки вона все ще не працює так, як я хочу, я не можу позначити це як вирішене. Золота зірка в моєму розумінні, у будь-якому випадку (і я обіцяю повернутися назад і поставити вам +1, як тільки моя представниця досягне вище 15)!
Нік Швед

Ви хочете сказати, що він все ще не працює з ОС X, навіть якщо працює rsync 3.x? Я не думаю, що --iconvце підтримується в 2.6.9; навіть якщо rsync просто доставляє опцію віддаленому хосту для обробки, їй потрібно розпізнати варіант на стороні OS X. Що which rsync; rsync --versionвам скаже, з терміналу OS X?
Лі Джонсон

Це правильно. Як ви бачите у повідомленні про помилку (третя сіра цитата у запитанні), він визнає, що я використовую 3.1 на mac: [Receiver = 3.1.1], і стверджує, що дія не підтримується, хоча, очевидно, працює з боку Linux, а також під час синхронізації з Mac, файлів на mac на сервері linux. Але з mac файли з linux до mac не працюють. Так дивно (як мінімум, на мої очі Noob).
Нік Швед

2
Якщо ви намагаєтеся це зробити з Linux, що станеться, якщо змусити виконуваний шлях чимось на зразок --rsync-path=/opt/local/bin/rsyncотримати відому версію 3.1.1 на стороні Mac?
Лі Джонсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.