rsync --iconv Option auf Mac funktioniert nicht (Synchronisierung vom Remote-Linux-Server zum lokalen Mac)

9

Ich möchte rsync verwenden, um Daten von einem Remote-Linux-Server auf meinem lokalen Mac zu sichern. Und ich möchte diesen Vorgang auf meinem lokalen Mac initialisieren. Alles funktioniert einwandfrei, außer dass es ein Sonderzeichenproblem gibt: Jedes Mal, wenn ich den rsync-Vorgang (nach der ersten Synchronisierung) erneut ausführe, werden die Dateien mit Sonderzeichen zuerst gelöscht und dann erneut synchronisiert. Soweit ich weiß, gibt es ein Problem mit verschiedenen Zeichensätzen, und die bevorzugte Lösung scheint darin zu bestehen, die --iconvOption zu verwenden:

Sie können die Option --iconv von rsync verwenden, um zwischen UTF-8 NFC und NFD zu konvertieren, zumindest wenn Sie einen Mac verwenden. Es gibt einen speziellen utf-8-mac-Zeichensatz, der für UTF-8 NFD steht. Um Dateien von Ihrem Mac auf Ihr NAS zu kopieren, müssen Sie Folgendes ausführen:

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

Dadurch werden alle lokalen Dateinamen von UTF-8 NFD in UTF-8 NFC auf dem Remote-Server konvertiert. Der Inhalt der Dateien wird nicht beeinflusst.

Das Problem ist, dass dies für mich nur in eine Richtung funktioniert, nämlich beim Synchronisieren vom Mac unter Linux. Aber ich möchte "in die andere Richtung gehen", dh von der Linux-Maschine auf den Mac synchronisieren. Und ich möchte den Vorgang von meinem lokalen Mac aus initialisieren. Aber wenn ich es versuche:

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

Ich erhalte eine Fehlermeldung:

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]

Ich kann nicht verstehen, warum dies nicht funktioniert. Meine rsync-Version auf dem Mac wurde von 2.6.9 aktualisiert. bis 3.1.1. mit Macports . Beachten Sie, dass der Vorgang dann funktioniert, wenn ich (auf dem Mac nota bene) eine Rsynchronisierung vom Mac nach Linux initiiere:

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

Aber vom Mac in die andere Richtung zu gehen - was ich tun möchte - funktioniert nicht.

Seltsamerweise wird beim Testen zum Initiieren der Synchronisierung vom Linux-Computer diese seltsame Meldung angezeigt:

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]

einschließlich der sehr seltsamen Behauptung [server=2.6.9], obwohl ich auf dem Mac auf 3.1.1 aktualisiert habe. Aus einigen Gründen sieht es so aus, als ob mein Linux-Computer nur die ursprüngliche rsync-Version auf dem Mac "sieht".

Irgendwelche Vorschläge, wie man das löst?

UPDATE 23. Oktober : Gemäß dem hervorragenden Vorschlag von @Lee Johnson (siehe unten) funktioniert das Initiieren der Synchronisierung vom Linux-Server jetzt. Der Vollständigkeit halber habe ich jetzt alle Kombinationen ausprobiert, und es ergibt sich ein interessantes Muster:

ON MAC:

ARBEITEN: Dateien von Mac zu Linux

FEHLER: Dateien von Linux auf Mac

AUF LINUX

WERKE: Dateien von Linux auf Mac

FEHLER: Dateien von Mac zu Linux

Mit anderen Worten, die --iconvOption scheint nur in eine Richtung zu funktionieren, mit Dateien vom lokalen Computer auf die Fernbedienung, nicht umgekehrt. Es sieht für mich wie ein Fehler aus, aber vielleicht soll es so funktionieren?

Kann jemand Licht ins Dunkel bringen?

Nick der Schwede
quelle
1
Wenn Sie ein benutzerdefiniertes rsync--rsync-path="/usr/local/bin/rsync"
Element
Ich habe .DS_Storevon Synchronisierungen ausgeschlossen und aus diesem Grund konnte OSX keine Verzeichnisse mit diesen Dateien löschen. Ich habe die Zeichensätze mit --iconv, den rsync-Pfad auf dem Mac mit --rsync-path(ich verwende Homebrew) eingerichtet und musste dann hinzufügen, --delete-excludeddamit die hartnäckigen Verzeichnisse gelöscht werden konnten.
Daniel

Antworten:

12

Nach vielen Experimenten und sehr aufgrund der hilfreichen Vorschläge von @Lee Johnson fand ich endlich die Lösung heraus, die mir jetzt peinlich offensichtlich erscheint. Aufgrund eines Kommentars, den ich bei der Untersuchung des Problems gelesen habe, dachte ich, Sie sollten den Zeichensatz in der Reihenfolge der Transformation angeben. aber es scheint, dass dies nicht die richtige Syntax ist. Vielmehr sollte man

IMMER --iconv=utf-8-mac,utf-8beim Initialisieren von rsync vom Mac und IMMER --iconv=utf-8,utf-8-macbeim Initialisieren von rsync vom Linux-Computer verwenden, unabhängig davon, ob ich Dateien vom Mac oder Linux-Computer synchronisieren möchte.

Dann funktioniert es wie Magie!

Nick der Schwede
quelle
UTF8-MAC ist ein Pseudo-Zeichensatz und per se nicht verfügbar mit iconvlib auf einem Linux-System, auch nicht mit der neuesten Version 3.1.1 in Ubuntu 14.04 LTS. Das funktioniert nicht, wenn Sie versuchen, die Synchronisierung unter Linux zu starten.
Achim Lammerts
5

Haben Sie kürzlich ein Upgrade auf OS X Yosemite durchgeführt? Ich hatte das gleiche Problem, bevor ich mich daran erinnerte, dass ich / usr / bin / rsync mit Version 3.1 aktualisiert hatte. Beim Upgrade auf Yosemite wurde dieses durch die alte Version 2.6.9 ersetzt.

In meinem Fall habe ich das Problem auf dem Mac behoben, indem ich meinen 3.1-Rsync wieder in / usr / bin verknüpft habe:

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit
Lee Johnson
quelle
Vielen Dank, das löst das Rätsel, warum ich das 2.6.9 bekommen habe. Botschaft. (Auf meinem Mac befindet sich die von Macport installierte Version in / opt / local / bin / rsync, aber das Ändern des Links zu diesem Sport hat magisch funktioniert.) Leider möchte ich die Synchronisierung von meinem MAC-Computer aus initialisieren, daher hilft dies nur Ich verstehe, dass mein Linux-Computer herausfinden kann, was zu tun ist. Warum funktioniert es nicht, wenn es von meinem Mac aus initialisiert wird? Das heißt, die "rsync -av --delete --iconv = utf-8, utf-8-mac mynas: remotedir / localdir /"
Nick The Swede
Lassen Sie mich auch sagen, dass ich leider einen zu niedrigen Ruf habe, um Ihre hilfreiche Antwort mit +1 beantworten zu können, und da es immer noch nicht so funktioniert, wie ich es möchte, kann ich es nicht als gelöst ankreuzen. Auf jeden Fall ein goldener Stern in meinem Kopf (und ich verspreche, zurück zu gehen und +1 zu geben, sobald mein Repräsentant über 15 ist)!
Nick The Swede
Wollen Sie damit sagen, dass es von OS X aus immer noch nicht funktioniert, selbst wenn rsync 3.x ausgeführt wird? Ich denke nicht, dass --iconvdies in 2.6.9 unterstützt wird; Selbst wenn rsync die Option nur zur Verarbeitung an den Remote-Host sendet, muss es die Option auf der OS X-Seite erkennen. Was which rsync; rsync --versionsagt Ihnen ein OS X-Terminal?
Lee Johnson
Das ist richtig. Wie Sie in der Fehlermeldung sehen können (drittes graues Zitat in der Frage), erkennt es, dass ich 3.1 auf dem Mac verwende: [Receiver = 3.1.1], und behauptet, dass die Aktion nicht unterstützt wird, obwohl sie offensichtlich funktioniert Von der Linux-Seite sowie beim Synchronisieren von Dateien auf dem Mac mit dem Linux-Server. Aber vom Mac aus funktionieren Dateien von Linux bis Mac nicht. So seltsam (zumindest für meine Noob-Augen).
Nick The Swede
2
Was passiert, wenn Sie dies unter Linux versuchen, wenn Sie den ausführbaren Pfad mit etwas erzwingen --rsync-path=/opt/local/bin/rsync, um Ihre bekannte 3.1.1-Version auf der Mac-Seite zu erhalten?
Lee Johnson