rsyncまたはafpdでUTF-8 NFDファイル名をUTF-8 NFCに変換する


24

FreeNAS 8を実行しているホームファイルサーバーがあります。数日前、rsyncを使用してMacからiTunesライブラリ全体をアップロードし、低速のUSBドライブからではなくネットワーク経由でライブラリをロードできるようにしました。これはほとんど機能し、iTunesは今ではずっと良く動作しますが、非ASCII文字を含む曲にアクセスする際に問題が発生します(Queensrÿcheトラックをロードするときに問題に最初に気付きました)。ファイルはFinderに表示されますが、それらにアクセスしようとすると、サーバーに再接続するまで消えていました。

いくつかの調査の後、OSXはLinuxとは異なるUTF文字順序を使用していることがわかった。OSXファイルシステムはUnicode正規化フォームD(NFD)を使用しますが、LinuxはフォームC(NFC)を使用します。Macからサーバーへのコピーを実行するとき、Rsyncはこれらのフォームを変換しません。現在、iTunesがネットワーク経由で特殊文字を含むファイルにアクセスしようとすると、サーバー上のファイルのエンコードが間違っており、afpdが報告しません存在します。

この問題に対処する最良の方法は何ですか?ベースライブラリをサーバーにアップロードするときに、rsyncにUnicode変換を実行させることは可能ですか?NFD形式でファイル名を送受信するようにafpdを構成できますか?サーバー上のファイル名を変更する簡単な解決策はありますか?convmvという名前のプログラムに関する情報をいくつか見つけましたが、FreeNASで実行できるかどうかはわかりません。


1
OS Xバージョンのrsyncのバグのように聞こえます。
イグナシオバスケス-エイブラムス

回答:


4

注:バージョン3.0.0以降のrsyncを使用している場合--iconv、他の回答に記載されているオプションは明らかに優れたソリューションです。

動作するはずのことは、ソースディレクトリとマウントされたリモートファイルシステム(SMB、NFS、AFP)の間でrsyncを実行することです。rsyncはローカルファイルシステムとして処理します。

ただし、これが実際にどの程度うまく機能するかはわかりません。異なる問題を回避する必要があります。たとえば、デフォルトではデルタ転送アルゴリズムは使用されません(ソースと宛先が「ローカル」であるため) no-whole-fileは機能しますか?)、たとえば、SMBが変更時間などを効果的に保持していることを確認する必要があります。


これが最終的に私がやったことです。NASからコレクション全体を削除し、NASのrsyncデーモンの代わりにローカルにマウントされたCIFS接続を使用して、rsyncを再度実行しました。現在、ファイル名の大文字化によるiTunesの問題を修正しています。:/
ChiperSoft

50

--iconv少なくともMac を使用している場合は、rsyncのオプションを使用して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
私は元のポスターではありませんので、それは私次第ではありませんが、これは、承認済みとしてフラグが付けられたものよりもはるかにクリーンで効率的なソリューションです。確かにこれを主演することは、とても役に立ちます。
-itsGC

1
素晴らしい答え; 私はUTF8-MACNFDの略を知りませんでした。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形式)で保存されますが、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フラグなしでantを使用):

-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.