おはげようございます。
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 年から利用されているツールにも関わらず、自分はほんの一部の機能しか使えてないんだろうなあと…思うと勉強不足が恥ずかしい。