rsync の –exclude オプション指定方法

サーバのデータは rsync でバックアップしている。最近、一部のディレクトリをバックアップの対象から外すため、–exclude オプションを追加した。ところが思ったように動作せず、除外するよう指定したディレクトリが、以前と同様にバックアップされてしまっていた。調べたところ –exclude オプションの指定が間違っていたことに気付く。rsync コマンドにおけるコピー元、コピー先の指定方法にちょっとクセがあることはよく知られているようだが、–exclude オプションにおけるディレクトリ方法もわかりにくいと思う。

仮に次のようなディレクトリ構成があると仮定する。

/foo/bar/
/foo/baz/
/backup/foo/

ここで /foo/ 以下をすべて /backup/foo/ に同期させたい場合、rsync コマンドのオプション指定は次のようになる。

rsync –archive –delete /foo/ /backup/foo/

さらに /foo/baz/ を同期対象から除外する場合は、–exclude オプションを次のように指定する。

rsync –archive –delete –exclude /baz/ /foo/ /backup/foo/

このとき –exclude オプションは同期元(コピー元)のディレクトリを基点とするため、/foo/baz/ を指定すると /foo/foo/baz/ ディレクトリが除外対象となってしまう。そのため対象ディレクトリを同期処理から除外できないばかりか、ディレクトリ構成によっては予想外のディレクトリが除外されてしまう可能性もある。