rsyncでローカルファイルの更新

ディレクトリコピー(cpとrsync)」では、cpコマンドとの違いを見ましたが、rsync本来のファイル同期をしてみたいと思います。

前回と同じく、コピー元のファイルを生成します。

~$ mkdir test;cd test
~/test$ mkdir src
~/test$ (cd src;seq 30 |perl -ne 'print chr' | split -db10)
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x02 2016-08-07 16:45:54.126639402 +0900
./src/x00 2016-08-07 16:45:54.126639402 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
~/test$ 

rsyncでディレクトリコピーします。

~/test$ rsync -r src/ dest
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x02 2016-08-07 16:45:54.126639402 +0900
./src/x00 2016-08-07 16:45:54.126639402 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x02 2016-08-07 16:46:36.102638657 +0900
./dest/x00 2016-08-07 16:46:36.102638657 +0900
./dest/x01 2016-08-07 16:46:36.102638657 +0900
~/test$ 

rsyncをもう一度実行して、destディレクトリを更新します。

~/test$ rsync -r src/ dest
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x02 2016-08-07 16:45:54.126639402 +0900
./src/x00 2016-08-07 16:45:54.126639402 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x02 2016-08-07 16:47:58.030637201 +0900
./dest/x00 2016-08-07 16:47:58.030637201 +0900
./dest/x01 2016-08-07 16:47:58.030637201 +0900
~/test$ 

dest内のファイルは、rsyncを実行する度にタイムスタンプが更新されてしまいます。更新済ファイルを更新しないようにするには、–updateオプションをつけます(ショートオプションは-r)。
src/x00をtouchでファイルスタンプを更新して、rsync -ruするとどうなるか確認してみましょう。

~/test$ touch src/x00
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x02 2016-08-07 16:45:54.126639402 +0900
./src/x00 2016-08-07 16:53:58.410630797 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x02 2016-08-07 16:47:58.030637201 +0900
./dest/x00 2016-08-07 16:47:58.030637201 +0900
./dest/x01 2016-08-07 16:47:58.030637201 +0900
~/test$ rsync -ru src/ dest
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x02 2016-08-07 16:45:54.126639402 +0900
./src/x00 2016-08-07 16:53:58.410630797 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x02 2016-08-07 16:47:58.030637201 +0900
./dest/x00 2016-08-07 16:54:13.546630528 +0900
./dest/x01 2016-08-07 16:47:58.030637201 +0900
~/test$ 

-uオプションにより、 dest側はx00のみ更新されました。ではsrc側のファイルが減った場合はどうなるでしょうか。

~/test$ rm src/x02
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x00 2016-08-07 16:53:58.410630797 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x02 2016-08-07 16:47:58.030637201 +0900
./dest/x00 2016-08-07 16:54:13.546630528 +0900
./dest/x01 2016-08-07 16:47:58.030637201 +0900
~/test$ rsync -ru src/ dest
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x00 2016-08-07 16:53:58.410630797 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x02 2016-08-07 16:47:58.030637201 +0900
./dest/x00 2016-08-07 16:54:13.546630528 +0900
./dest/x01 2016-08-07 16:47:58.030637201 +0900
~/test$ 

src側のファイルが減っても、rsync後にdest側は変化ありませんでした。
src側のファイル削除に対応するには、–deleteオプションを指定します。

~/test$ rsync -ru --delete src/ dest
~/test$ find -type f -exec stat -c'%n %y' {} \;
./src/x00 2016-08-07 16:53:58.410630797 +0900
./src/x01 2016-08-07 16:45:54.126639402 +0900
./dest/x00 2016-08-07 16:54:13.546630528 +0900
./dest/x01 2016-08-07 16:47:58.030637201 +0900
~/test$ 

One response to “rsyncでローカルファイルの更新

  1. Thanks for helping me to see things in a direffent light.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA