rsyncの罠

いろいろとはまったのでメモ。

1. --delete-excludedオプション
--exclude-fromを使って一部のディレクトリーやファイルを対象外にすることはよくあるだろう。
この時、単に--deleteだけだと、--exclude-fromを変更する前にコピーしていたアイテムはdestから削除されることはない。
--delete-excludedをつけるとコピー対象から除外されるだけではなく、既にdestにコピーしていたものもdestinationから削除される。
具体的な使用例はこんな感じ。

rsync -av --delete --delete-excluded --exclude-from=/home/exclude /home/src/ /home/dest

2. NTFSとのやりとり
ext3同士とかならなんの問題もないがext3とNTFSの間でのrsyncの場合、いろいろ注意が必要。
-pオプションを使ってはダメ:NTFSではパーミッションが自由に設定できない。そのため、-pをつけていると、destにはパーミッションが異なる、違うファイルがあると判断して、srcのファイルをコピーする。つまり、差分をコピーしようとして結局は全ファイルをコピーすることになる。また-aオプションには-pが含まれているので注意。
--modifiy-window=1オプションが必要:NTFSのタイムスタンプの精度のため。destには時刻が異なる、違うファイルががあると判断して、srcのファイルをコピーするので。
具体的な使用例はこんな感じ。

rsync -rltDv --delete --delete-excluded --exclude-from=/home/exclude --modify-window=1 /home/src/ /mnt/ntfs/dest

3. --exclude-fromの書き方

rsync -av --delete --delete-excluded --exclude-from=/home/exclude /home/src/ /home/dest

というコマンドを考える。
/home/exclude に例えば bin と書いておくと、/home/src/bin だけではなく、/home/src/local/bin なども除外されてしまう。
/home/src/bin は除外したいが、/home/src/local/bin は含めたいという場合には、

/bin

と書く。実際のディレクトリーが /home/src/bin であっても単に /bin と書けばよい。ちょっと意外。

【参考URL】
http://ubuntuforums.org/showthread.php?t=820425