rsync 또는 afpd에서 UTF-8 NFD 파일 이름을 UTF-8 NFC로 변환


24

FreeNAS 8을 실행하는 홈 파일 서버가 있습니다. 며칠 전에 rsync를 사용하여 Mac에서 전체 iTunes 보관함을 업로드하여 느린 USB 드라이브 대신 네트워크를 통해 보관함을로드 할 수있었습니다. 이것은 주로 효과가 있었고 iTunes는 훨씬 더 잘 작동하지만 ASCII가 아닌 문자가있는 노래에 액세스하는 데 문제가 있습니다 (Queensrÿche 트랙을로드 할 때 문제가 처음 나타났습니다). 파일이 Finder에 표시되지만 서버에 다시 연결할 때까지 파일에 액세스하려고하면 파일이 사라졌습니다.

약간의 연구 끝에 OSX가 Linux와 다른 UTF 문자 순서를 사용하기 때문에 이것이 발견되었습니다. OSX 파일 시스템은 NFD (Unicode Normalization Form D)를 사용하며, 여기서 Linux는 NFC (Form C)를 사용합니다. Rsync는 내 Mac에서 서버로 복사를 수행 할 때 이러한 양식을 변환하지 않습니다. 이제 iTunes가 네트워크를 통해 특수 문자가있는 파일에 액세스하려고하면 서버의 파일에 잘못된 인코딩 및 afpd 보고서가 표시됩니다. 존재하지 않습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 기본 라이브러리를 서버에 업로드하는 동안 rsync가 유니 코드 변환을 수행하도록 할 수 있습니까? 파일 이름을 NFD 형식으로 전송 / 수신하도록 afpd를 구성 할 수 있습니까? 서버에서 파일 이름을 변경하는 쉬운 해결책이 있습니까? convmv라는 프로그램에 대한 정보를 찾았지만 FreeNAS에서 실행할 수 있는지 모르겠습니다.


1
rsync OS X 버전의 버그처럼 들립니다.
Ignacio Vazquez-Abrams

답변:


4

참고 : 버전 3.0.0 이상 rsync를 사용하는 --iconv경우 다른 답변에서 언급 한 옵션이 분명히 우수한 솔루션입니다.

뭔가 해야 작업이 소스 디렉토리 사이에 rsyncing하고는 원격 파일 시스템을 마운트 (SMB, NFS, AFP) rsync를 그냥 로컬 파일 시스템으로 처리합니다.

그러나 이것이 실제로 얼마나 잘 작동하는지 알지 못하고 다른 문제를 해결해야합니다. 예를 들어 델타 전송 알고리즘은 기본적으로 사용되지 않습니다 (소스 및 대상이 "로컬"이므로)- 전체 파일이 작동하지 않습니까?) 예를 들어 SMB가 수정 시간 등을 효과적으로 보존하는지 확인해야합니다.


이것이 결국 내가 한 일입니다. NAS에서 전체 모음을 삭제하고 NAS의 rsync 데몬 대신 로컬로 마운트 된 CIFS 연결을 사용하여 rsync를 다시 실행했습니다. 이제 파일 이름 대문자로 아이튠즈 문제를 해결하고 있습니다. : /
ChiperSoft

50

rsync --iconv옵션을 사용 하여 최소한 Mac을 사용하는 경우 UTF-8 NFC와 NFD간에 변환 할 수 있습니다 . utf-8-macUTF-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-MACNFD 를 나타내는 줄 몰랐다 . iconv자체적으로 사용될 때 , 이것은 NFC와 NFD 사이에서 앞뒤로 변환하기위한 일반적인 메커니즘을 제공합니다.
mklement

정답은 Linux 서버와 Mac을 동기화 할 때 오랫동안 지속되는 문제를 해결하는 것입니다.
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 형식)으로 저장되지만 NAS에서 실행중인 Samba 서버는 UTF NFC 형식 파일 이름 만 이해합니다. CIFS / SMB (Samba) 인터페이스를 사용하여 파일을 복사하면 모든 것이 정상입니다.


0

내 경험상 ssh 대신 SMB를 사용하는 것이 좋습니다. Iconv는 인코딩 문제를 해결하지만 다른 시스템에서 허용되는 문자에는 여전히 문제가 있습니다.

Mac의 원본 파일 이름 :

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

SMB를 통한 rsync로 복사 한 후 :

-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

ssh를 통해 rsync로 복사 한 후 (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.