rsync でファイルに変更がない場合にhardlinkを作成する --link-dest を利用して差分バックアップを取る

このオプション知らなかった。いわゆるsnapshotのようなものが手軽にできますね。

$ rsync --help
(略)
 --link-dest=DIR         hardlink to files in DIR when unchanged


まず、一度rsyncで完全なコピーを作る。

$ rsync -avz data/ snapshot1/

この後、--link-destオプションをつけてrsyncを実行すれば、rsyncを作成する時にdataに変更があったものだけはコピーされて、変更がないものはhardlinkが作成される。(ディレクトリはhardlinkできないのでコピーされる)

このとき、--link-dest の引数を相対パスで指定する場合、コピー先のディレクトリからの相対になるので注意。(rsync実行時のディレクトリからの相対パスではない)


man rsync

If DIR is a relative path, it is relative to the destination directory.

とややこしいので、フルパスで指定するほうが良いかな。

## 相対パス
$ rsync -avz --link-dest=../snapshot1/ data/ snapshot2/
## 絶対パス
$ rsync -avz --link-dest=/path/to/snapshot1/ data/ snapshot2/

以後、rsyncを実行する度に--link-dest の引数を新しいディレクトリに置き換えていく。

$ rsync -avz --link-dest=/path/to/snapshot2/ /path/to/data/ /path/to/snapshot3/


後はdateコマンドの+format オプション等と組み合わせて適当なscriptでも作ってcronで動かしとけば良いですね。