rsync man page には delete
オプションがいくつかあるのを見ましたが、それらの違いがよくわかりません。これらのオプションの違いは何ですか?
--del an alias for --delete-during
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before transfer (default)
--delete-during receiver deletes during xfer, not before
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not before
--delete-excluded also delete excluded files from dest dirs
141 Skilldrick 2010-06-25
--del/--delete_during
:コピー先のdirからコピーされたファイルを削除します(--delete-before
に比べてメモリを節約します。--delete-before
は、削除可能なファイルを探すために別のスキャンを行います)。)--delete
:コピー元ディレクトリにファイルが存在しない場合、コピー先ディレクトリのファイルを削除します--delete-before
:ソースディレクトリから同名のファイルをコピーする前に、コピー先ディレクトリのファイルを削除します--delete-during
:コピー元のディレクトリから同名のファイルをコピーしている間に、コピー先のディレクトリのファイルを削除する--delete-delay
:転送中にマークを削除しますが、転送が完了するまで待ちます--delete-after
:rsync の他の部分が余分なファイルを他の場所に移動した場合、--delete-delay
の代わりに--delete-delay
が転送の途中で何を削除するかを決定するのに対し、--delete-after
はすべてが終了した後に削除されるべきファイルのディレクトリをチェックするからです--delete-excluded
:転送元ディレクトリから明示的に除外されたファイルを転送先ディレクトリから削除します
rsync のポイントはコピーではなくアーカイブです。これは重要な区別です。削除/変更されたファイルの処理は非常に重要であり、多くの場合は微妙な違いがあります
特に --delete
フラグは何度も失敗しているのを見てきました。多くの人が優先度の低いストレージにファイルを移動させるために rsync を使っていますが、この場合、移動先のディレクトリにファイルが存在していることが必要です。これは delete が行うことではありません。--delete
は、元のディレクトリからファイルを削除するときに、それが移動先のディレクトリからも削除されることを確認して、移動先がジャンクでいっぱいにならないようにします。一度、ある人が新しいドライブを入れて、毎晩のrsyncスクリプトをオフにしないことでバックアップを一掃したのを見ました。スクリプトはソースディレクトリが空になったことを見て、それは宛先ディレクトリのすべてのファイルを削除しました
他のオプションのほとんどは、スペースやパフォーマンスに関係しています。あなたが何かをする前に転送が成功していることを確認したい場合は、ファイルを削除するときが重要ですが、あなたのデバイスが小さすぎてすべての情報の2つのコピーを扱うことができない場合は、あなたが行くように削除する必要がありますなど。それは複数のプラットフォームをまたいで長い歴史のために少し奇妙です:特定の動作に慣れていた人が混乱しないように、いくつかのオプションが追加されています
142 Satanicpuppy 2010-06-25
デフォルトでは、rsync
は転送先側のファイルを一切削除しません。rsync
にファイルを全く削除させないようにするには、少なくとも一つの削除オプションを使う必要があります
ファイルがいつ削除されるかを気にしないのであれば、--delete
を使用してrsync
を選択してください。--delete
を他の削除オプションと組み合わせることもできますが (これは競合しません)、他のすべての削除オプションはすでに --delete
を意味しているので、その必要はありません
--delete-before
は以下のように動作します。rsync
は、転送元にあるファイルと転送先にあるファイルを検索し、転送先にあるが転送元にはないファイルをすべて削除してから、実際の同期を開始します。この順序は、転送先のストレージ容量が少ない場合に、新しいファイルの転送を開始する前に転送先のディスク容量を解放することができるので便利です。不都合な点は、rsync
では処理を実行するためにより多くのメモリを必要とすることと、全体の処理が2段階の処理になるため、処理速度が遅くなることです
--delete-during
は以下のように動作します。rsync
はすぐにファイルの同期を開始し、宛先にしか存在しないファイルに出くわしたら削除します。この方法では、速度の低下はなく、追加のメモリも必要ありません。欠点は、削除されたファイルが削除される前に、最初に多くの新しいファイルが目的地にコピーされることが起こるかもしれないことで、そのため、目的地では、操作中に、操作全体が完了した後、最終的に必要とするよりもはるかに多くのディスクストレージ容量を必要とする可能性があります
--delete-after
は次のように動作します。最初にすべてのファイルを同期化し、その後、--delete-before
が同期化フェーズの前に行うのと同じ操作を行う。これは、最も一般的なケースでは最悪の選択です。ほとんどの場合、ほとんどのメモリを必要とし、宛先ではほとんどのディスクスペースを必要とし、2つのステッププロセスであるため、より遅くなります。このオプションは、主に “マージファイル “を使用している場合に存在します(マージファイルが何であるか、どのように動作するかは、この答えの範囲を超えています)。これらのファイルには、削除時に除外するファイルのルールが含まれている可能性があるので、削除フェーズの間にその内容を考慮しなければならない場合、新しいマージファイルは削除フェーズの前にコピーされなければなりません。それが要求されない限り、--delete-after
には何の利点もありません
--delete-delay
はかなり新しいオプションです(rsync
2.6.9では利用できませんが、例えばmacOS 10.15ではデフォルトのままです)。--delete-during
と同じように動作しますが、ファイルをすぐに削除するのではなく、同期が完了した後に削除するという点を除けば、--delete-during
と--delete-after
のハイブリッドです。メリットは --delete-after
よりも高速で、正しくマージファイルをサポートしていることですが、デメリットは同期中により多くのメモリを必要とすることです
--delete-excluded
は、同期元に存在するかどうかに関わらず、同期元に存在しないファイルを削除するだけでなく、同期から除外されたファイル(--exclude
または--exclude-from
)を同期先にも削除するようにrsync
に指示します
6 Mecki 2019-12-31
2つのことが起こっています
- 誰が削除するんだ?
- それが起こると
送信者か受信者のどちらかに削除を指示することができます (なぜこれが重要なのかはわかりません)。つまり、一方のコンピュータからrsyncがもう一方のコンピュータのrsyncサーバに接続したときに、誰が事実上削除コマンドを発行しているかが決まるということです
前はすべてのファイルが削除され、その後 rsync がファイルをコピーします。これは転送が中断された場合にのみ重要です
2 Michael Pryor 2010-06-25
もう一つ言及する価値のあるポイントは、ソースディレクトリが /*
で終わる場合、rsync はそれらのファイルのみを考慮し、ディレクトリ自体は考慮しないということです (したがって、宛先で削除したいファイルが存在しないということです)
上記で削除オプションを指定しているのに、rsync が削除していないように見える場合は、ディレクトリそのものを意味するときに誤ってグローバル化してファイルのリストを提供していないか確認してください
2 Walt Stoneburner 2013-01-17