LoginSignup
3
3

More than 5 years have passed since last update.

OS XのrsyncはNFDに対応していない&対策

Last updated at Posted at 2015-09-27

--excludeが効かない問題

現在のディレクトリ構成はこういう状態。

$ tree -N
.
├── dest
└── src
    ├── ä
    ├── b
    └── c

2 directories, 3 files

src/ディレクトリ以下のäbというファイルを除外してdest/にコピーしたいので、--excludeで指定する。

$ rsync -av src/ --exclude ä --exclude b dest
sending incremental file list
./
ä
c

sent 156 bytes  received 57 bytes  426.00 bytes/sec
total size is 0  speedup is 0.00
$ ls dest/
ä  c

……なぜかäがコピーされている。

なぜか

OS Xが採用しているHFS+では、ファイル名をNFDで正規化する。NFDでは、äa¨の組み合わせで表現される。
しかし、一般的にUnicodeではNFCという別の正規化手法が用いられている。NFCではääという一文字で表現される。

ターミナルで入力した文字はNFCのäなので、NFDのa¨がexclude対象にならなかった。

対策

NFCをNFDに変換してからrsyncに渡してやればOK。

以下のファイルをPATHの通った場所に置いて実行権限を付ける。ファイル名はxrsyncとする。

#!/usr/bin/env ruby

require "shellwords"

system ["rsync", *ARGV].shelljoin.encode("UTF-8-MAC")

UTF-8-MACというのは、NFDで正規化してUTF-8で符号化した形式の通称。

実際にxrsyncを使って確認してみる。

$ xrsync -av src/ --exclude ä --exclude b dest
sending incremental file list
./
c

sent 105 bytes  received 38 bytes  286.00 bytes/sec
total size is 0  speedup is 0.00
$ ls dest/
c

äはコピーされなくなった。

ちなみに

関連情報

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3