opsi rsync --iconv pada Mac tidak berfungsi (sinkronisasi dari server Linux jarak jauh ke Mac lokal)

9

Saya ingin menggunakan rsync untuk membuat cadangan data dari server Linux jarak jauh ke Mac lokal saya. Dan saya ingin menginisialisasi operasi ini di Mac lokal saya. Semua berfungsi dengan baik kecuali ada masalah karakter khusus: setiap kali saya menjalankan kembali operasi rsync (setelah sinkronisasi awal), file-file dengan karakter khusus pertama-tama dihapus dan kemudian disinkronkan kembali. Sejauh yang saya mengerti, ada masalah dengan set karakter yang berbeda, dan solusi yang disukai tampaknya menggunakan --iconvopsi:

Anda dapat menggunakan opsi --iconv rsync untuk mengkonversi antara UTF-8 NFC & NFD, setidaknya jika Anda menggunakan Mac. Ada set karakter utf-8-mac khusus yang merupakan singkatan dari UTF-8 NFD. Jadi untuk menyalin file dari Mac Anda ke NAS Anda, Anda perlu menjalankan sesuatu seperti:

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

Ini akan mengonversi semua nama file lokal dari UTF-8 NFD ke UTF-8 NFC pada server jarak jauh. Konten file tidak akan terpengaruh.

Masalahnya adalah ini hanya berfungsi 'satu arah' bagi saya, yaitu saat menyinkronkan dari Mac ke linux. Tapi saya ingin 'pergi ke arah lain', yaitu menyinkronkan DARI mesin linux KE Mac. Dan saya ingin menginisialisasi operasi dari Mac lokal saya. Tetapi ketika saya mencoba:

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

Saya menerima kesalahan:

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]

Saya bingung untuk memahami mengapa ini tidak berhasil. Versi rsync saya di Mac diperbarui dari 2.6.9. ke 3.1.1. menggunakan Macports . Perhatikan bahwa operasi bekerja ketika saya (di Mac, nota bene) memulai rsync DARI Mac KE Linux:

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

Tapi sebaliknya 'dari mac - yang ingin saya lakukan - tidak bekerja.

Anehnya, pengujian untuk memulai sinkronisasi dari mesin linux membuat pesan aneh ini:

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]

termasuk, perhatikan, klaim yang sangat aneh [server=2.6.9], meskipun saya telah memperbarui ke 3.1.1 di Mac. Untuk beberapa alasan, sepertinya mesin linux saya 'hanya melihat' versi rsync asli di Mac.

Ada saran tentang cara mengatasi ini?

UPDATE 23 Oktober : Per saran bagus @Lee Johnson (lihat di bawah), memulai sinkronisasi dari server linux sekarang berfungsi. Untuk kelengkapan, sekarang saya telah mencoba semua kombinasi, dan sebuah pola menarik muncul:

PADA MAC:

KARYA: File dari Mac ke Linux

GAGAL: File dari Linux ke Mac

PADA LINUX

KARYA: File dari Linux ke Mac

GAGAL: File dari Mac ke Linux

Dengan kata lain, --iconvopsi ini tampaknya hanya bekerja satu arah, dengan file dari mesin lokal ke remote, bukan sebaliknya. Sepertinya bug bagi saya, tapi mungkin itu cara yang seharusnya bekerja?

Adakah yang bisa berbagi cahaya tentang ini?

Nick si Swedia
sumber
1
saat menggunakan custom rsync(mis. dari homebrew) pada mac dan memanggilnya dari linux, perlu untuk menentukan path yang benar menggunakan--rsync-path="/usr/local/bin/rsync"
meduz
Saya tidak termasuk .DS_Storedari sinkronisasi dan karena OSX ini tidak dapat menghapus direktori dengan file-file ini di dalamnya. Saya mengatur set karakter dengan --iconv, jalur rsync pada mac dengan --rsync-path(Saya menggunakan homebrew), dan kemudian harus menambahkan --delete-excludedsehingga direktori yang membandel dapat dihapus.
Daniel

Jawaban:

12

Setelah banyak bereksperimen, dan sangat banyak karena saran bermanfaat @Lee Johnson, saya akhirnya menemukan solusinya, yang sekarang menurut saya sangat jelas. Sebagian besar karena komentar yang saya baca ketika meneliti masalah, saya pikir Anda seharusnya menentukan karakter yang diatur dalam urutan transformasi; tetapi tampaknya itu bukan sintaks yang benar. Sebaliknya, seseorang harus

SELALU digunakan --iconv=utf-8-mac,utf-8saat menginisialisasi rsync dari mac, dan SELALU digunakan --iconv=utf-8,utf-8-macsaat menginisialisasi rsync dari mesin linux, tidak masalah jika saya ingin menyinkronkan file dari mesin mac atau linux.

Maka itu bekerja seperti sihir!

Nick si Swedia
sumber
UTF8-MAC adalah pseudo-charset dan tidak tersedia dengan ikonvlib pada sistem Linux, bahkan tidak dengan versi 3.1.1 terbaru di Ubuntu 14.04 LTS. Itu tidak berfungsi jika Anda mencoba memulai sinkronisasi di Linux.
Achim Lammerts
5

Apakah Anda baru saja meningkatkan ke OS X Yosemite? Saya memiliki masalah yang sama, sebelum saya ingat bahwa saya telah memperbarui / usr / bin / rsync dengan versi 3.1. Ketika saya memutakhirkan ke Yosemite, ini diganti dengan versi 2.6.9 yang lama.

Dalam kasus saya sendiri, saya memperbaiki masalah pada Mac dengan menghubungkan kembali 3.1 rsync saya kembali ke / usr / bin:

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit
Lee Johnson
sumber
Terima kasih satu juta, itu memecahkan misteri mengapa saya mendapatkan 2.6.9 itu. pesan. (Di Mac saya, versi Macport yang terinstal di / opt / local / bin / rsync, tetapi mengubah tautan ke olahraga itu berfungsi ajaib.) Sayangnya, saya ingin menginisialisasi sinkronisasi dari mesin MAC saya, jadi ini hanya membantu saya sejauh memahami bahwa mesin Linux saya dapat mengetahui apa yang harus dilakukan. Jadi mengapa itu tidak berfungsi ketika diinisialisasi dari Mac saya? Yaitu, "rsync -av --delete --iconv = utf-8, utf-8-mac mynas: remotedir / localdir /"
Nick The Swede
Izinkan saya juga mengatakan bahwa sayangnya saya memiliki reputasi yang terlalu rendah untuk dapat memberi +1 pada jawaban Anda yang bermanfaat, dan karena itu masih tidak berfungsi seperti yang saya inginkan, saya tidak dapat mencentangnya sebagai diselesaikan. Bintang emas di pikiranku, dalam hal apa pun (dan aku berjanji akan kembali dan memberi Anda +1 segera setelah perwakilan saya mencapai di atas 15)!
Nick The Swede
Apakah Anda mengatakan bahwa itu masih tidak berfungsi dari sisi OS X, bahkan dengan rsync 3.x berjalan? Saya tidak berpikir itu --iconvdidukung di 2.6.9; bahkan jika rsync hanya mengirim opsi ke host jarak jauh untuk penanganan, ia perlu mengenali opsi di sisi OS X. Apa yang Anda which rsync; rsync --versionkatakan, dari terminal OS X?
Lee Johnson
Itu benar. Seperti yang dapat Anda lihat di pesan kesalahan (kutipan abu-abu ketiga dalam pertanyaan), ia mengenali bahwa saya menggunakan 3,1 pada mac: [Receiver = 3.1.1], dan mengklaim bahwa tindakan tersebut tidak didukung, meskipun ternyata berhasil. dari sisi Linux, serta ketika saya menyinkronkan, dari Mac, file di mac ke server linux. Tetapi dari mac, file dari linux ke mac tidak berfungsi. Sangat aneh (setidaknya bagi mata noob saya).
Nick The Swede
2
Ketika Anda mencoba ini dari Linux, apa yang terjadi jika Anda memaksa jalur yang dapat dieksekusi dengan sesuatu seperti --rsync-path=/opt/local/bin/rsyncuntuk mendapatkan versi 3.1.1 Anda yang dikenal di sisi Mac?
Lee Johnson