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