การแปลงชื่อไฟล์ UTF-8 NFD เป็น UTF-8 NFC ไม่ว่าจะเป็น rsync หรือ afpd


24

ฉันมีเซิร์ฟเวอร์ไฟล์ภายในบ้านที่ใช้ FreeNAS 8 ไม่กี่วันที่ผ่านมาฉันใช้ rsync เพื่ออัปโหลดไลบรารี iTunes ทั้งหมดของฉันจาก Mac เพื่อที่ฉันจะสามารถโหลดห้องสมุดของฉันผ่านเครือข่ายแทนที่จะเป็นไดรฟ์ USB ที่ช้า ส่วนใหญ่ใช้งานได้แล้วและ iTunes ทำงานได้ดีขึ้นมากในขณะนี้ แต่ฉันพบปัญหาในการเข้าถึงเพลงใด ๆ ที่มีตัวละครที่ไม่ใช่ ASCII (ฉันพบปัญหาครั้งแรกเมื่อโหลดเพลงของQueensrÿche) ไฟล์จะปรากฏใน Finder แต่ความพยายามในการเข้าถึงทำให้มันหายไปจนกว่าฉันจะเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้ง

หลังจากการวิจัยพบว่านี่เป็นเพราะ OSX ใช้ลำดับอักขระ UTF ที่แตกต่างจาก Linux ระบบไฟล์ OSX ใช้ Unicode Normalization Form D (NFD) โดยที่ linux ใช้ Form C (NFC) Rsync ไม่แปลงแบบฟอร์มเหล่านี้เมื่อทำการคัดลอกจาก mac ของฉันไปยังเซิร์ฟเวอร์ตอนนี้เมื่อ iTunes พยายามเข้าถึงไฟล์ที่มีอักขระพิเศษผ่านเครือข่ายไฟล์บนเซิร์ฟเวอร์จะมีการเข้ารหัสที่ผิดและรายงาน AFPD ที่พวกเขาทำไม่ได้ ' ไม่มีตัวตน

วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คืออะไร? เป็นไปได้ไหมที่จะทำให้ rsync ทำการแปลง Unicode ในขณะที่ทำการอัพโหลดไลบรารี่ฐานไปยังเซิร์ฟเวอร์? ฉันสามารถกำหนดค่า afpd ให้ส่ง / รับชื่อไฟล์ในรูปแบบ NFD ได้หรือไม่ มีวิธีง่ายๆในการเปลี่ยนชื่อไฟล์บนเซิร์ฟเวอร์หรือไม่? ฉันพบบางสิ่งเกี่ยวกับโปรแกรมที่ชื่อ convmv แต่ฉันไม่รู้ว่าฉันสามารถเรียกใช้งานบน FreeNAS ได้หรือไม่


1
ฟังดูเหมือนบั๊กกับ rsync เวอร์ชัน OS X
Ignacio Vazquez-Abrams

คำตอบ:


4

หมายเหตุ:หากคุณใช้เวอร์ชัน 3.0.0 หรือใหม่กว่าของ rsync --iconvตัวเลือกตามที่ระบุไว้ในคำตอบอื่น ๆ นั้นเป็นทางออกที่เหนือกว่าอย่างชัดเจน

สิ่งที่ควรทำงานคือ rsyncing ระหว่างไดเร็กทอรีต้นทางและระบบไฟล์รีโมตที่เมาท์ (SMB, NFS, AFP), ซึ่ง rsync จะถือว่าเป็นระบบไฟล์โลคัล

อย่างไรก็ตามฉันไม่ทราบว่าวิธีนี้ใช้ได้ผลดีในทางปฏิบัติและคุณต้องแก้ไขปัญหาต่าง ๆ ตัวอย่างเช่นอัลกอริทึมการถ่ายโอนเดลต้าจะไม่ถูกใช้งานโดยค่าเริ่มต้น (เนื่องจากแหล่งที่มาและปลายทางคือ "ท้องถิ่น") (อาจ - ไม่มีไฟล์ทั้งหมดจะทำงาน?) คุณต้องตรวจสอบเช่นว่า SMB รักษาเวลาการแก้ไข ฯลฯ ได้อย่างมีประสิทธิภาพ


ในที่สุดนี่คือสิ่งที่ฉันทำ ฉันลบคอลเล็กชันทั้งหมดจาก NAS และรัน rsync อีกครั้งโดยใช้การเชื่อมต่อ CIFS ที่ติดตั้งในเครื่องแทน rsync daemon บน NAS ตอนนี้ฉันแค่แก้ไขปัญหา iTunes จากการใช้อักษรตัวพิมพ์ใหญ่ของชื่อไฟล์ : /
ChiperSoft

50

คุณสามารถใช้--iconvตัวเลือกrsync เพื่อแปลงระหว่าง 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 บนเซิร์ฟเวอร์ระยะไกล เนื้อหาของไฟล์จะไม่ได้รับผลกระทบ


1
ฉันไม่ใช่ Original Poster ดังนั้นจึงไม่ใช่เรื่องของฉัน แต่นี่เป็นวิธีแก้ปัญหาที่ดีกว่าและมีประสิทธิภาพกว่าที่ได้รับการยอมรับ นำแสดงโดยนี้แน่นอนจะมีประโยชน์มาก
ItsGC

1
คำตอบที่ดี; ฉันไม่มีความคิดที่ว่าUTF8-MACสำหรับ NFD; เมื่อใช้กับiconvตัวเองสิ่งนี้จะให้กลไกทั่วไปสำหรับการแปลไปมาระหว่าง NFC และ NFD
mklement

คำตอบที่ดีนี้แก้ปัญหามานานในซิงค์ mac กับเซิร์ฟเวอร์ linux!
meduz

2
สำหรับ mac คุณอาจต้องใช้brew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz

ฉันได้รับrsync: --iconv: unknown option
KMC

7

ขณะนี้ฉันใช้rsync --iconvสิ่งนี้:

คัดลอกไฟล์จากเซิร์ฟเวอร์ Linux ไปยังเครื่อง OS X

คุณควรรันคำสั่งนี้จากเครื่อง OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 'username@server.ip.address.here:/home/username/path/on/server/' /Users/username/path/on/machine/

การคัดลอกไฟล์จากเครื่อง OS X ไปยังเซิร์ฟเวอร์ Linux

คุณควรรันคำสั่งนี้จากเครื่อง OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'

0

อย่าใช้ rsync เพื่อคัดลอกไฟล์ไปยัง NAS ของคุณ เมื่อคุณใช้ rsync เพื่อคัดลอกไฟล์ชื่อไฟล์จะถูกเก็บไว้ใน NAS ของคุณในรูปแบบ UTF NFD (เช่นรูปแบบ OSX) แต่เซิร์ฟเวอร์ Samba ที่ทำงานบน NAS ของคุณจะเข้าใจชื่อไฟล์รูปแบบ UTF NFC เท่านั้น ใช้ส่วนต่อประสาน CIFS / SMB (Samba) เพื่อคัดลอกไฟล์และทุกอย่างจะเรียบร้อย


0

จากประสบการณ์ของฉันฉันแนะนำให้ใช้ SMB แทน ssh Iconv แก้ปัญหาด้วยการเข้ารหัส แต่ยังคงมีปัญหากับตัวอักษรที่ได้รับอนุญาตในระบบที่แตกต่าง:

ชื่อไฟล์ต้นฉบับบน Mac:

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

หลังจากคัดลอกโดย rsync ผ่าน 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

หลังจากคัดลอกโดย rsync บน ssh (พร้อม ant โดยไม่มีไอคอน iconv):

-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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.