kazmax - Linux で自宅サーバー

ファイルの中身に差分があるファイルだけrsyncする

ファイルの中身に差分がある場合だけrsyncします。ファイルの中身が同じ場合は、タイムスタンプが違っていてもコピーしません。タイムスタンプの違いは無視です。

Last Update : 2014年02月04日

ファイルの中身に差分があるファイルだけrsyncする 目次

  1. rsync の checksum オプション
  2. 差分ファイルだけrsync

1. rsync の checksum オプション

rsyncにchecksumというオプションがあります。

checksum(チェックサム)というのは、転送元と転送先でデータに誤りがないかを確認する仕組みの事です。 転送元のファイルと転送先のファイルでそれぞれある計算を元にファイルのデータから値を算出し、算出した値が一致するかを調べます。 算出した値そのものをチェックサムと呼ぶ場合もあります。

rsync に checksum オプションをつけると、コピー元とコピー先でファイルのチェックサムが確認され、 コピー先で既に存在する同じチェックサムとサイズを持つ同じ名前のファイルはスキップされます。

その結果、ファイルの内容に差分あるファイルだけがコピーの対象となります。

2. 差分ファイルだけrsync

実際に差分ファイルだけを対象に rsync してみます。

rsync 書式

rsync [option] コピー元 コピー先

※ オプションの説明はここでは省略します。

中身は同じで、タイムスタンプが異なるファイルをrsync

中身の同じファイルを作成
# echo aaa > source/test.txt
# echo aaa > dest/test.txt

タイムスタンプを変更
# touch -t 201402040000 dest/test.txt

中身は同じで、タイムスタンプが異なるファイルがある
# ls -l ./*
./dest:
合計 4
-rw-r--r--. 1 root root 4  2月  4 00:00 2014 test.txt

./source:
合計 4
-rw-r--r--. 1 root root 4  2月  4 09:01 2014 test.txt

checksum オプションをつけてrsyncする
# rsync --checksum -av source/test.txt dest/test.txt
sending incremental file list

sent 52 bytes  received 15 bytes  134.00 bytes/sec
total size is 4  speedup is 0.06

タイムスタンプは異なるが、中身に差分がないのでコピーされない。

中身は異なるが、同じタイムスタンプで、同じサイズのファイルをrsync

中身が違うファイルを作成
# echo aaa > source/test.txt
# echo bbb > dest/test.txt

タイムスタンプを揃える
# touch -t 201402040000 source/test.txt
# touch -t 201402040000 dest/test.txt

中身は異なるが、同じタイムスタンプで、同じサイズのファイルがある
# ls -l ./*
./dest:
合計 4
-rw-r--r--. 1 root root 4  2月  4 00:00 2014 test.txt

./source:
合計 4
-rw-r--r--. 1 root root 4  2月  4 00:00 2014 test.txt

checksum オプションをつけてrsyncする
# rsync --checksum -av source/test.txt dest/test.txt
sending incremental file list
test.txt

sent 96 bytes  received 31 bytes  254.00 bytes/sec
total size is 4  speedup is 0.03

中身に差分があるのでコピーされる。