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

9

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

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

Проблема в том, что для меня это работает только «в одну сторону», а именно при синхронизации с 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 в 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 октября : замечательное предложение Пера @ Джонсона (см. Ниже), инициализация синхронизации с сервера linux теперь работает. Для полноты я попробовал все комбинации, и появился интересный паттерн:

НА MAC:

РАБОТАЕТ: Файлы с Mac на Linux

ОШИБКИ: файлы из Linux на Mac

ON LINUX

РАБОТАЕТ: Файлы с Linux на Mac

ОШИБКИ: файлы с Mac на Linux

Другими словами, эта --iconvопция, кажется, работает только одним способом, с файлами с локального компьютера на удаленный, а не наоборот. Для меня это похоже на ошибку, но, может быть, именно так ДОЛЖЕН работать?

Кто-нибудь может поделиться этим светом?

Ник Швед
источник
1
при использовании кастомного rsync(например, из homebrew) на mac и вызова его из linux, необходимо указать правильный путь с помощью--rsync-path="/usr/local/bin/rsync"
meduz 31.10.15
Я исключил .DS_Storeиз синхронизации и из-за этого OSX не мог удалить каталоги с этими файлами внутри. Я установил наборы символов с --iconvпомощью пути rsync на компьютере Mac --rsync-path(я использую homebrew), а затем мне пришлось добавить, --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, вернув мой rsync 3.1 обратно в / 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)!
Ник Швед
Вы говорите, что он все еще не работает со стороны OS 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 не работают. Так странно (по крайней мере, моим глазам).
Ник Швед
2
Когда вы пытаетесь сделать это из Linux, что произойдет, если вы принудительно --rsync-path=/opt/local/bin/rsyncзапустите путь к исполняемому файлу, чтобы получить известную версию 3.1.1 на стороне Mac?
Ли Джонсон