rsyncでのフォルダ同期時の文字化けが解決した
iconvオプションを使えばよかった
前回のエントリの最後のほうで書いたように、rsyncでフォルダを同期しようとしたら、同期自体は正常にできるものの、ログの部分に表示される日本語ファイル名が全部文字化けしておりました。
で、これを解決する方法として、rsyncに--iconvというオプションがあることを知りました。
Macの濁点ファイルをなんとかする - Qiita
http://www.izurunet.jp/2013/04/13/rsync%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B%E6%99%82%E3%81%AFiconv%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92
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… - 人力検索はてな
結論としてはよくわからない。