Mengonversi nama file UTF-8 NFD ke UTF-8 NFC, baik dalam rsync atau afpd

24

Saya memiliki server file rumah yang menjalankan FreeNAS 8. Beberapa hari yang lalu saya menggunakan rsync untuk mengunggah seluruh pustaka iTunes saya dari Mac sehingga saya bisa memuat pustaka saya melalui jaringan daripada mematikan drive USB yang lambat. Ini sebagian besar berhasil, dan iTunes berjalan jauh lebih baik sekarang, tapi saya mengalami masalah mengakses lagu apa pun yang memiliki karakter non-ascii di dalamnya (saya pertama kali melihat masalah saat memuat lagu Queensrÿche). File akan muncul di Finder, tetapi setiap upaya untuk mengaksesnya membuat mereka menghilang sampai saya terhubung kembali ke server.

Setelah beberapa penelitian saya menemukan ini karena OSX menggunakan urutan karakter UTF berbeda dari Linux. Sistem file OSX menggunakan Unicode Normalization Form D (NFD), di mana linux menggunakan Form C (NFC). Rsync tidak mengonversi bentuk-bentuk ini ketika melakukan copy dari mac saya ke server, sekarang ketika iTunes mencoba mengakses file dengan karakter khusus melalui jaringan, file-file di server memiliki pengodean yang salah dan laporan afpd yang mereka tidak miliki. tidak ada.

Apa cara terbaik untuk mengatasi masalah ini? Apakah mungkin untuk membuat rsync melakukan konversi unicode saat mengunggah perpustakaan dasar ke server? Dapatkah saya mengkonfigurasi afpd untuk mengirim / menerima nama file dalam format NFD? Apakah ada solusi mudah untuk mengubah nama file di server? Saya menemukan beberapa hal tentang sebuah program bernama convmv, tetapi saya tidak tahu apakah saya dapat menjalankannya di FreeNAS.

ChiperSoft
sumber
1
Kedengarannya seperti bug dengan versi rsync OS X.
Ignacio Vazquez-Abrams

Jawaban:

4

Catatan: Jika Anda menggunakan versi 3.0.0 atau yang lebih baru dari rsync, --iconvopsi seperti yang disebutkan dalam jawaban lain jelas merupakan solusi yang unggul.

Sesuatu yang seharusnya bekerja adalah menyinkronkan antara direktori sumber dan sistem file jarak jauh yang dipasang (SMB, NFS, AFP), yang rsync hanya akan memperlakukan sebagai sistem file lokal.

Namun, saya tidak tahu seberapa baik ini bekerja dalam praktiknya, dan Anda harus mengatasi masalah yang berbeda, misalnya algoritma delta-transfer tidak akan digunakan secara default (karena sumber dan tujuan adalah "lokal") (mungkin - no-whole-file akan berfungsi?), Anda harus memeriksa, misalnya, bahwa SMB secara efektif mempertahankan waktu modifikasi, dll.

LCC
sumber
Inilah yang akhirnya saya lakukan. Saya menghapus seluruh koleksi dari NAS dan menjalankan rsync lagi, menggunakan koneksi CIFS yang dipasang secara lokal alih-alih daemon rsync pada NAS. Sekarang saya hanya memperbaiki masalah itunes dari kapitalisasi nama file. : /
ChiperSoft
50

Anda dapat menggunakan --iconvopsi rsync untuk mengkonversi antara UTF-8 NFC & NFD, setidaknya jika Anda menggunakan Mac. Ada utf-8-macset karakter khusus yang merupakan singkatan dari UTF-8 NFD. Jadi untuk menyalin file dari Mac ke NAS Anda, Anda harus 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.

Lennart L
sumber
1
Saya bukan Poster Asli, jadi itu bukan terserah saya, tapi ini adalah solusi yang jauh lebih bersih dan efisien daripada yang ditandai sebagai diterima. Dibintangi ini pasti, akan sangat berguna.
ItsGC
1
Jawaban bagus; Saya tidak tahu yang UTF8-MACberarti NFD; bila digunakan dengan iconvdirinya sendiri, ini menyediakan mekanisme umum untuk menerjemahkan bolak-balik antara NFC dan NFD.
Penyelesaian
jawaban yang bagus, ini memecahkan masalah lama dalam menyelaraskan mac dengan server linux!
meduz
2
Di mac Anda juga mungkin perlubrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz
Saya mendapatkanrsync: --iconv: unknown option
KMC
7

Saat ini saya menggunakan rsync --iconvseperti ini:

Menyalin file dari server Linux ke mesin OS X

Anda harus menjalankan perintah ini dari mesin OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 '[email protected]:/home/username/path/on/server/' /Users/username/path/on/machine/

Menyalin file dari mesin OS X ke server Linux

Anda harus menjalankan perintah ini dari mesin OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ '[email protected]:/home/username/path/on/server/'
Envek
sumber
0

Jangan gunakan rsync untuk menyalin file ke NAS Anda. Ketika Anda menggunakan rsync untuk menyalin file, nama file akan disimpan pada NAS Anda dalam format UTF NFD (yaitu format OSX) tetapi server Samba yang berjalan pada NAS Anda hanya memahami nama file format UTF NFC. Gunakan antarmuka CIFS / SMB (Samba) untuk menyalin file dan semuanya akan baik-baik saja.

cambuk
sumber
0

Dari pengalaman saya, saya sarankan menggunakan SMB daripada ssh. Iconv memecahkan masalah dengan pengkodean, tetapi masih ada masalah dengan karakter yang diizinkan pada sistem yang berbeda:

Nama file asli di Mac:

https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s

Setelah menyalin oleh rsync melalui SMB:

-as seen by Mac (over SMB):     https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
-as seen by Ubuntu (over SMB):  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
-as seen by Windows10 (over SMB):   https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
-as seen by Ubuntu server locally:  https-img-9gag-fun.9cache.comphotoadK9jzN_460s

Setelah menyalin oleh rsync melalui ssh (dengan semut tanpa flag flagv):

-as seen by Mac (over SMB):     H0INHQ~6
-as seen by Ubuntu (over SMB):  H0INHQ~6
-as seen by Windows10 (over SMB):   H0INHQ~6
-as seen by Ubuntu server locally:  https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s
lukdz
sumber