🔄

rsync の delete オプション各種

2020/11/11に公開

rsync は、高速な差分ファイル転送ができるコマンドラインツールです。

さまざまな用途に使えるツールですがとくに、ディレクトリ間の同期を行ったり、ディレクトリのバックアップを作成したりする場合に使われることが多いです。その際によく使われるオプションとして -a--archive)と --delete があります。

このうち --delete については、細かい挙動が異なるいくつかのオプションが存在しています。このオプションを紹介します。

deleteオプションとは

rsync--delete オプションは、転送元のディレクトリに存在せず転送先のディレクトリに存在するファイルがあれば削除する、というオプションです。

典型的な使い方を挙げます。src ディレクトリを backup ディレクトリの下にバックアップするには、以下のようにオプションを指定して実行すれば良いです。

rsync -a --delete src backup

このコマンドの -a オプションによって、src 以下のファイルの各種プロパティを保持して backup にコピーします。--delete オプションによって、src から削除されているファイルは backup からも削除します。

さまざまなdeleteオプション

rsync version 3.2.3のmanページによれば、--delete と同じ処理を行うオプションが4種類存在しています。これらはどれも --delete と同じようにファイルを削除するオプションであり、同じ結果をもたらします。異なるのは、「いつ」ファイルを削除するかです。

  • --delete-before : ファイルの転送を開始する前に、削除するファイルを走査して転送先からファイルを削除します。
  • --delete-during : ファイルを転送しながら、削除すべきファイルが見つかれば削除します。
  • --delete-delay : ファイルを転送しながら、削除すべきファイルを記録しておき、転送が終了した後に転送先からファイルを削除します。
  • --delete-after : ファイルの転送が終了した後に、削除するファイルを走査して転送先からファイルを削除します。

なお、「いつ」を明示的に指定しない --delete オプションは、rsync 3.0.0以降では --delete-during と同じ動作をします。また、それより古いバージョンでは --delete-before と同じ動作をします。

どのオプションを使うべきか

削除処理のタイミングを細かく検討したいなら、マニュアルにメリットとデメリットが書いてあるので、それを読んで吟味するのが良いでしょう。この記事は単にオプションを紹介しているだけですので、より詳しく知りたいならマニュアルを読むべきです。

そのうえで、簡単な指針を書いてみます。

そもそもとくにこだわりがなければ --delete で良いでしょう。途中の挙動が少し異なるだけで結果は同じなのですから、用意されているデフォルトの処理に合わせるのが妥当です。

多くの状況では --delete-during が効率が良さそうです。rsync 3ではデフォルトの挙動です。rsync 2でもこの挙動にしたい場合は明示的に指定します。

転送先に空き容量が少ない場合は、先に転送先のファイルを削除する --delete-before が有益です。ただし、同期するファイルが多い場合は全体の走査やファイルの削除に時間がかかるため、実際の転送が行われるまでに時間がかかるというデメリットがあります。場合によっては、転送が行われる前にタイムアウトしてしまう可能性が考えられます。

ファイルの削除よりも先にファイルの転送を終わらせてしまいたい、という考え方もあります。転送先の空き容量が十分ならば、削除はそれほど優先しなくても良いでしょう。その場合は --delete-after または --delete-delay が良さそうです。

補足

deleteオプションは、転送先のディレクトリからファイルを削除する処理であり破壊的な操作ですので、実行時には間違えないように注意が必要です。

たとえば rsync を使う際に間違いやすいポイントのひとつとして、転送元のディレクトリ名の末尾に / をつけるかつけないかで挙動が異なるという点があります。間違い防止には、-n--dry-run)オプションや -v--verbose)オプションが有益です。

GitHubで編集を提案

Discussion