Я хочу использовать 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
опция, кажется, работает только одним способом, с файлами с локального компьютера на удаленный, а не наоборот. Для меня это похоже на ошибку, но, может быть, именно так ДОЛЖЕН работать?
Кто-нибудь может поделиться этим светом?
.DS_Store
из синхронизации и из-за этого OSX не мог удалить каталоги с этими файлами внутри. Я установил наборы символов с --iconv
помощью пути rsync на компьютере Mac --rsync-path
(я использую homebrew), а затем мне пришлось добавить, --delete-excluded
чтобы упрямые каталоги можно было удалить.
rsync
(например, из homebrew) на mac и вызова его из linux, необходимо указать правильный путь с помощью--rsync-path="/usr/local/bin/rsync"