rsync - L'opzioneiconv su Mac non funziona (sincronizzazione dal server Linux remoto al Mac locale)


9

Voglio usare rsync per eseguire il backup dei dati da un server Linux remoto sul mio Mac locale. E voglio inizializzare questa operazione sul mio Mac locale. Tutto funziona bene, tranne per il fatto che esiste un problema con i caratteri speciali: ogni volta che rieseguo l'operazione rsync (dopo la sincronizzazione iniziale), i file con caratteri speciali vengono prima eliminati e quindi risincronizzati. A quanto ho capito, c'è un problema con diversi set di caratteri e la soluzione preferita sembra essere l'uso --iconvdell'opzione:

Puoi usare l'opzione --iconv di rsync per convertire tra UTF-8 NFC e NFD, almeno se sei su un Mac. Esiste uno speciale set di caratteri utf-8-mac che sta per UTF-8 NFD. Quindi, per copiare i file dal Mac al NAS, è necessario eseguire qualcosa del tipo:

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

Questo convertirà tutti i nomi di file locali da UTF-8 NFD a UTF-8 NFC sul server remoto. Il contenuto dei file non sarà interessato.

Il problema è che questo funziona solo "in un modo" per me, vale a dire quando si esegue la sincronizzazione dal Mac a Linux. Ma voglio 'andare dall'altra parte', ovvero sincronizzare DALLA MACCHINA Linux AL MAC. E voglio inizializzare l'operazione dal mio Mac locale. Ma quando provo:

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

Ricevo un errore:

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]

Sono in perdita per capire perché questo non funziona. La mia versione di rsync su Mac è stata aggiornata dalla 2.6.9. al 3.1.1. usando Macports . Si noti che l'operazione funziona quando I (su Mac, nota bene) avvia una sincronizzazione da Mac a Linux:

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

Ma andare dall'altra parte "dal mac - che è quello che voglio fare - non funziona.

Stranamente, i test per avviare la sincronizzazione dalla macchina linux rendono questo strano messaggio:

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]

incluso, nota, l'affermazione molto strana [server=2.6.9], anche se ho aggiornato a 3.1.1 sul Mac. Per alcuni motivi, sembra che la mia macchina linux 'vede' solo la versione rsync originale sul Mac.

Qualche suggerimento su come risolverlo?

AGGIORNAMENTO 23 ottobre : l'eccellente suggerimento di Per @Lee Johnson (vedi sotto), l'avvio della sincronizzazione dal server Linux ora funziona. Per completezza, ora ho provato tutte le combinazioni e emerge un modello interessante:

SU MAC:

FUNZIONA: file da Mac a Linux

GUASTI: file da Linux a Mac

SU LINUX

FUNZIONA: file da Linux a Mac

GUASTI: file da Mac a Linux

In altre parole, l' --iconvopzione sembra funzionare solo in un modo, con i file dal computer locale al telecomando, non viceversa. A me sembra un bug, ma forse è così che si suppone funzioni?

Qualcuno in grado di condividere la luce su questo?


1
quando usi un custom rsync(es. da homebrew) sul mac e lo chiami da linux, è necessario specificare il percorso corretto usando--rsync-path="/usr/local/bin/rsync"
meduz

Stavo escludendo .DS_Storedalla sincronizzazione e per questo OSX non sono riuscito a eliminare le directory con questi file all'interno. Ho impostato i set di caratteri --iconv, il percorso rsync sul Mac con --rsync-path(sto usando homebrew), e quindi ho dovuto aggiungere in --delete-excludedmodo che le directory testarde potessero essere eliminate.
Daniel,

Risposte:


12

Dopo molti esperimenti e grazie ai suggerimenti utili di @Lee Johnson, ho finalmente scoperto la soluzione, che ora mi sembra imbarazzantemente ovvia. Molto a causa di un commento che ho letto durante la ricerca del problema, ho pensato che avresti dovuto specificare il set di caratteri nell'ordine di trasformazione; ma sembra che non sia la sintassi corretta. Piuttosto, si dovrebbe

Utilizzare SEMPRE --iconv=utf-8-mac,utf-8durante l'inizializzazione di rsync dal mac e SEMPRE utilizzare --iconv=utf-8,utf-8-macdurante l'inizializzazione di rsync dalla macchina linux, non importa se voglio sincronizzare i file dalla macchina mac o linux.

Quindi funziona come per magia!


UTF8-MAC è uno pseudo-charset e non è di per sé disponibile con iconvlib su un sistema Linux, nemmeno con l'ultima versione 3.1.1 in Ubuntu 14.04 LTS. Non funziona se si tenta di avviare la sincronizzazione su Linux.
Achim Lammerts,

5

Hai recentemente aggiornato a OS X Yosemite? Ho avuto lo stesso problema, prima di ricordare che avevo aggiornato / usr / bin / rsync con la versione 3.1. Quando ho eseguito l'aggiornamento a Yosemite, questo è stato sostituito con la vecchia versione 2.6.9.

Nel mio caso, ho risolto il problema sul Mac ricollegando il mio 3.1 rsync in / usr / bin:

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

Grazie mille, questo risolve il mistero del perché ho ottenuto quel 2.6.9. Messaggio. (Sul mio Mac, tuttavia, la versione installata di Macport è in / opt / local / bin / rsync, ma la modifica del collegamento a quello sport ha funzionato in modo magico.) Sfortunatamente, voglio inizializzare la sincronizzazione dal mio computer MAC, quindi questo aiuta solo per quanto ho capito che la mia macchina Linux può capire cosa fare. Quindi perché non funziona se inizializzato dal mio Mac? Cioè, "rsync -av --delete --iconv = utf-8, utf-8-mac mynas: remotedir / localdir /"
Nick The Swede,

Consentitemi anche di dire che purtroppo ho una reputazione troppo bassa per essere in grado di fare +1 sulla tua utile risposta, e poiché non funziona ancora come voglio, non posso contrassegnarla come risolta. Stella d'oro nella mia mente, in ogni caso (e prometto di tornare indietro e farti +1 non appena il mio rappresentante supera i 15)!
Nick The Swede,

Stai dicendo che non funziona ancora dal lato OS X, anche con rsync 3.x in esecuzione? Non penso che --iconvsia supportato in 2.6.9; anche se rsync sta semplicemente consegnando l'opzione all'host remoto per la gestione, deve riconoscere l'opzione sul lato OS X. Cosa which rsync; rsync --versionti dice, da un terminale OS X?
Lee Johnson,

È corretto. Come puoi vedere nel messaggio di errore (terza citazione grigia nella domanda), riconosce che sto usando 3.1 sul Mac: [Receiver = 3.1.1], e afferma che l'azione non è supportata, sebbene evidentemente funzioni dal lato Linux, così come quando sincronizzo, dal Mac, i file dal Mac al server Linux. Ma dal Mac, i file da Linux a Mac non funzionano. Così strano (almeno ai miei occhi di noob).
Nick The Swede,

2
Quando provi questo da Linux, cosa succede se imponi il percorso eseguibile con qualcosa del genere --rsync-path=/opt/local/bin/rsyncper ottenere la tua versione 3.1.1 nota sul lato Mac?
Lee Johnson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.