ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【rsync】delete オプションについて調査

rsync で delete オプションを使ってみたのでここにメモを残します。

rsync

「rsync」は、リモート環境とファイルやディレクトリを「同期(sync)する」というコマンドです。ローカル環境のみでも使用できます。「変更があった分だけ更新する」という機能があるので、ディレクトリ単位のバックアップで特に便利に使えます。

--delete オプション について

転送元のディレクトリになくて、転送先のディレクトリに存在するファイルは削除するオプションです。
以下5種類あります。

オプション 処理内容
--delete-before ファイルの転送を開始する前に、対象ファイルを走査して転送先からファイルを削除
--delete-during ファイルを転送しながら、対象ファイルが見つかれば削除
--delete-delay ファイルを転送しながら、対象ファイルを記録し、転送が終了した後に転送先からファイルを削除
--delete-after ファイルの転送が終了した後に、対象ファイルを走査し、転送先からファイルを削除
--delete [ --delete-during ] と同じ

具体例

やりたいこと

  • src ディレクトリ以下を dst にコピーしたい
  • dst/sample-01/gomi.txt は削除したい

転送前の構成は以下の通りです。

  • 転送元: src
  • 転送先: dst
home/
  ├ src/
  │  └ sample-01/
  │        ├ foo/
  │        │    └ foo.txt
  │        ├ bar.txt
  │        └ baz.txt
  │        
  └ dst/
     ├ sample-01/
     │       └ gomi.txt
     └ hogehoge.txt
想定した挙動

以下のコマンドを実行します。

rsync -av --delete src/sample-01/* dst

実行結果は以下のとおりです。

home/
  ├ src/
  │  └ sample-01/
  │        ├ foo/
  │        │    └ foo.txt
  │        ├ bar.txt
  │        └ baz.txt
  │ 
  └ dst/
     ├ sample-01/
     │      ├ foo/
     │      │    └ foo.txt
     │      ├ bar.txt
     │      └ baz.txt
     └ hogehoge.txt
想定外の挙動

以下のコマンドを実行します。

rsync -av --delete src/sample-01 dst

実行結果は以下のとおりです。

  • dst/sample-01/* というパスにならない
  • hogehoge.txt がなくなる
home/
  ├ src/
  │  └ sample-01/
  │        ├ foo/
  │        │    └ foo.txt
  │        ├ bar.txt
  │        └ baz.txt
  │ 
  └ dst/
     ├ foo/
     │    └ foo.txt
     ├ bar.txt
     └ baz.txt