おはげようございます。

tl;dr

rsync に同期先のファイルを更新する前にバックアップしてくれる --backupというオプションがあることを最近知ったのでメモっておく。

memo

man rsync

$ man rsync | grep "--backup"
        -b, --backup                make backups (see --suffix & --backup-dir)
            --backup-dir=DIR        make backups into hierarchy based in DIR
            --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)
  • --suffix=foo を使うことでバックアップするファイル名に foo を付け加えてくれる
  • --backup-dir=bar を使うことで同期前に bar ディレクトリをバックアップして同期する

demo

--backup オプションと --prefix を利用して test01 ディレクトリ以下を test02 以下に同期する。

#
# test01 と test02 ディレクトリを作成
#
$ mkdir test01 test02

#
# test01 以下に test01.txt ファイルを作成
#
$ echo "test01" > test01/test01.txt

#
# 初めての同期
#
$ rsync -avz --backup --suffix="-`date +%Y%m%d%H%M%S`" test01/ test02/
sending incremental file list
test01.txt

sent 111 bytes  received 31 bytes  284.00 bytes/sec
total size is 7  speedup is 0.05

#
# test01.txt を更新
#
$ echo "test01" >> test01/test01.txt

#
# 改めて同期
#
$ rsync -avz --backup --suffix="-`date +%Y%m%d%H%M%S`" test01/ test02/
sending incremental file list
test01.txt

sent 118 bytes  received 31 bytes  298.00 bytes/sec
total size is 14  speedup is 0.09

#
# test02 ディレクトリ以下を確認
#
$ ls -l test02/
total 8
-rw-rw-r-- 1 vagrant vagrant 14 Nov 26 14:52 test01.txt
-rw-rw-r-- 1 vagrant vagrant  7 Nov 26 14:50 test01.txt-20151126145207 # バックアップが作成されている

#
# ファイルの中身を確認
#
$ for i in `ls test02/*`; do echo $i; cat $i; done
test02/test01.txt
test01
test01
test02/test01.txt-20151126145207
test01

--backup--backup-dir を利用して test01 ディレクトリ以下を test02 以下に同期する。

#
# まずは普通に同期
#
$ rsync -avz  test01/ test02/
sending incremental file list
./
test01.txt

sent 121 bytes  received 34 bytes  310.00 bytes/sec
total size is 49  speedup is 0.32

#
# 確認
#
$ tree -A .
.
├── test01
│   └── test01.txt
└── test02
    └── test01.txt

2 directories, 2 files

#
# ファイルを更新
#
$ echo "test01" >> test01/test01.txt

#
# 改めて --backup オプションを付けて同期
#
$ rsync -avz --backup --backup-dir=test02 --suffix="-`date +%Y%m%d%H%M%S`" test01/ test02/
sending incremental file list
test01.txt

sent 118 bytes  received 31 bytes  298.00 bytes/sec
total size is 56  speedup is 0.38

#
# 元の test02 がディレクトリ毎バックアップされている(元ディレクトリ以下にバックアップされる)
#
$ tree -A .
.
├── test01
│   └── test01.txt
└── test02
    ├── test01.txt
    └── test02
        └── test01.txt-20151126234001

3 directories, 3 files

以上

rsync は Wikipedia によると 1996 年から利用されているツールにも関わらず、自分はほんの一部の機能しか使えてないんだろうなあと…思うと勉強不足が恥ずかしい。

元記事はこちら

(超メモ)rsync に同期先のファイルをバックアップするオプションを初めて知ったのでメモ