Я хочу использовать rsync для резервного копирования данных с удаленного сервера Linux на мой локальный Mac. И я хочу инициализировать эту операцию на моем локальном Mac. Все работает нормально, за исключением того, что есть проблема со специальными символами: каждый раз, когда я повторно запускаю операцию rsync (после начальной синхронизации), файлы со специальными символами сначала удаляются, а затем повторно синхронизируются. Насколько я понимаю, есть проблема с разными наборами символов, и предпочтительное решение кажется, использовать --iconv
вариант:
Вы можете использовать параметр 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 на удаленном сервере. На содержимое файлов это не повлияет.
Проблема в том, что для меня это работает только «в одну сторону», а именно при синхронизации с 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 октября: Согласно отличному предложению @Lee Johnson (см. Ниже), запуск синхронизации с сервера linux теперь работает. Для полноты картины я перепробовал все комбинации, и обнаружилась интересная закономерность:
НА MAC:
РАБОТАЕТ: файлы с Mac на Linux
НЕИСПРАВНОСТИ: файлы с Linux на Mac
НА LINUX
РАБОТАЕТ: Файлы с Linux на Mac
НЕИСПРАВНОСТИ: файлы с Mac на Linux
Другими словами, --iconv
вариант, похоже, работает только в одном направлении, с файлами с локального компьютера на удаленный, а не наоборот. Мне это кажется ошибкой, но, может быть, так оно и должно работать?
Кто-нибудь может пролить свет на это?
После долгих экспериментов и во многом благодаря полезным предложениям @Lee Johnson я, наконец, нашел решение, которое теперь кажется мне досадно очевидным. Во многом из-за комментария, который я прочитал при исследовании проблемы, я подумал, что вы должны указать набор символов в порядке преобразования; но похоже, что это неправильный синтаксис. Скорее следует
ВСЕГДА используйте --iconv=utf-8-mac,utf-8
при инициализации rsync с Mac и ВСЕГДА используйте --iconv=utf-8,utf-8-mac
при инициализации rsync с машины Linux, независимо от того, хочу ли я синхронизировать файлы с машины Mac или Linux.
Тогда это работает как по волшебству!
Вы недавно обновились до 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