RT:ドヤリング

Twitterのドヤリングアカウント(@doyaling)の出張所です。文章が長くなるときにコチラ使用します。

rsyncでのフォルダ同期時の文字化けが解決した

iconvオプションを使えばよかった

 前回のエントリの最後のほうで書いたように、rsyncでフォルダを同期しようとしたら、同期自体は正常にできるものの、ログの部分に表示される日本語ファイル名が全部文字化けしておりました。


 で、これを解決する方法として、rsyncに--iconvというオプションがあることを知りました。


Macの濁点ファイルをなんとかする - Qiita
rsyncで文字化けする時はiconvオプションを | だいだらぼっちの閑寂見聞譚


 はてな人力検索で質問して教えてもらったものです。

rsyncの最新バージョンをインストールする

 ただ、上記のサイトに書かれているようにオプションを付けるだけでは上手くいかなかったんですよね。
 やってみると、

rsync: --iconv=UTF8-MAC,UTF-8: unknown option
rsync error: syntax or usage error (code 1) at /SourceCache/rsync/rsync-45/rsync/main.c(1333) [client=2.6.9]


 というエラーがでる。
 これはなぜかというと、Mac OS Xに標準でインストールされているrsyncのバージョンが古くて、--iconvというオプションに対応していないからのようです。


 それで、先ほどの
 Macの濁点ファイルをなんとかする - Qiita
 にも書いてあるように、Homebrewで最新のrsyncをインストールすることにしました。
 Homebrew自体入れていなかったので、今回初めて導入しました。
 MacにHomebrewをインストールする - Qiita
 このページのコメント欄にあるように、最新のURLを指定して、ターミナルから、

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


 と打って、指示通りにreturnキーを押してパスワードを入れただけです。


 Homebrewのインストール後、さっきのサイトにしたがって、

brew tap homebrew/dupes
brew install libiconv
brew install rsync


 と打って最新版のrsyncをインストールしました。
 しかしこれはよく考えたらiconvのライブラリをインストールしているわけなので、ひょっとして、rsyncのバージョンは関係なく、このライブラリの有無だけが問題なんですかね?

シンボリックリンクを貼る

 ただ、最新版をインストールしたらそれでおしまいかというと、そうでもなくて、
 backup - rsync --iconv option on Mac not working (sync from remote Linux server to local Mac) - Server Fault
 このページの解説にしたがって、

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit


 という処理をしました。
 これはようするに、もともとMac OSの標準のコマンドとしてインストールされていた
 /usr/bin/rsync
 の名前をまず「rsync-2.6.9」に変更(だからその名前で呼び出せばまた使える)しておいて、同じディレクトリ内にrsyncという名のシンボリックリンクを作成し、従来通りターミナルからrsyncと打った場合にはこのシンボリックリンクを経由して
 /usr/local/bin/rsync
 を起動することにしたということだと思います。


 ちなみに、そのリンク先の
 /usr/local/bin/rsync
 をみてみたところ、それもじつはシンボリックリンクになっていて、参照先は
 /usr/local/Cellar/rsync/3.1.1/bin/rsync
 となっていました。ここに、Homebrewでインストールされた最新のrsyncが置かれてるわけですね。


 つまりこれは、新しくできたシンボリックリンクである
 /usr/bin/rsync
 が、いったん
 /usr/local/bin/rsync
 という別のシンボリックリンクを経由して
 /usr/local/Cellar/rsync/3.1.1/bin/rsync
 を起動しにいくという、二段ジャンプみたいな感じだと思います。


 べつに二段ジャンプにせずに直接参照することにしてもいいと思うし、そもそもターミナルから
 /usr/local/Cellar/rsync/3.1.1/bin/rsync
 か
 /usr/local/bin/rsync
 を指定して実行することにすれば、
 /usr/bin/rsync
 を書き換える必要もないと思いますが。


 まぁ、何はともあれ、これでうまく--iconvオプションが使えるようになりました。

rsync -auv --delete --iconv=UTF8-MAC,UTF-8 /Volumes/4TB_Main/ /Volumes/4TB_Backup/


 というふうにやると、日本語文字化けしない状態でrsyncを実行することができます。ファイル名の文字コードをUTF8-MACからUTF-8に変えているという意味ですね。

さらなる落とし穴

 しかし!
 日本語ファイル名を文字化けさせずに同期できるようになったのはいいんですが、ヘンなことに気づきました。
 上記のように--iconvオプションをつけると、同期元で更新されていないファイルまで全て新たに同期先へ上書きされてしまい、差分だけの同期にならないです。
 解決方法あるのかもしれませんが、現段階ではわかりません。調べてもないけど。
 これはかなり困る(同期にものすごい時間がかかる)ので、基本的には--iconvオプションなしで日々の同期を実施し、何かエラーが起きたときにターミナルからログをみながら操作するという場面で使うぐらいにしとこうかな……。


 困ったので、人力検索で新たに質問を立てている。
 Macでのrsyncコマンドの使い方についての質問です。 http://q.ha… - 人力検索はてな


 結論としてはよくわからない。