web-dev-qa-db-ja.com

rsyncまたはafpdのいずれかでのUTF-8 NFDファイル名のUTF-8 NFCへの変換

私は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で実行できるかどうかわかりません。

26
ChiperSoft

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

すべきの動作は、ソースディレクトリとマウントされたリモートファイルシステム(SMB、NFS、AFP)の間でrsyncしており、rsyncはローカルファイルシステムとして扱います。

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

4
LCC

Rsyncの--iconvオプションを使用して、少なくともMacを使用している場合は、UTF-8 NFC&NFDの間で変換できます。特別な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リモートサーバー上。ファイルの内容は影響を受けません。

53
Lennart L

現在、私はrsync --iconvを次のように使用しています:

LinuxサーバーからOS Xマシンへのファイルのコピー

このコマンドを実行する必要がありますOS Xマシンから

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 '[email protected]:/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/ '[email protected]:/home/username/path/on/server/'
7
Envek

NASへのファイルのコピーにrsyncを使用しないでください。 rsyncを使用してファイルをコピーすると、ファイル名はNAS UTF UFD形式(つまりOSX形式)で保存されますが、SambaサーバーはNAS =はUTFのみを理解しますNFC=ファイル名をフォーマットします。CIFS/ SMB(Samba)インターフェースを使用してファイルをコピーすると、すべて正常に動作します。

1
whyme

私の経験から、私は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によるコピー後(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
0
lukdz