ソース フォルダーから削除されたファイルを rsync で削除するにはどうすればよいですか?

ソース フォルダーから削除されたファイルを rsync で削除するにはどうすればよいですか?

最近、ゲーム サーバーをホストするために Ubuntu Server を搭載したマシンをセットアップしました。マシン上の特定のフォルダーにゲーム ワールド ファイルのバックアップを頻繁に作成するバックアップ プラグインを各ゲーム サーバーにインストールしました。また、オプションcron付きの rsync を使用して、これらのバックアップを毎晩 Dropbox フォルダーに自動的にコピーするタスクも設定しました-a

数か月後、Dropbox アカウントのストレージ容量が上限に達し、バックアップをそれほど多く保存できないことに気付きました。そこで、ゲーム サーバー バックアップ プラグインをそれほど多くのバックアップを保持しないように設定し、数日間待って、週ごとにスケジュールされているように古いバックアップが削除されるかどうかを確認しました。バックアップ プラグインは最終的にその役割を果たし、古いバックアップを削除したので、その後 cronrsyncタスクによって Dropbox フォルダーから古いバックアップが削除され、ソース フォルダーと一致すると期待していましたが、そうはなりませんでした。そこで、いくつか質問があります。

  • デフォルトではrsync追加ソースフォルダに追加されたファイルを宛先フォルダにコピーし、変化ソースフォルダ内で変更されたが、削除しないソースフォルダから削除されたファイルですか?

  • もしそうなら、rsyncこれを行うための最善の方法は何でしょうか? 宛先フォルダーがソース フォルダーを完全に反映するようにしたいのですが、それはソース フォルダーから削除されたファイルをすべて削除することを意味します。

マニュアル ページに、rsyncうまくいくかもしれないオプションがいくつかリストされていますが、詳しくありません。

答え1

ターゲット内のファイルを削除するには、--deleteコマンドにオプションを追加します。例:

rsync -avh source/ dest/ --delete

注:-avh--archive --verbose --human-readable

答え2

rsyncコマンドでいくつかのオプションを使用している間は、コマンドはファイルを削除しませんdelete。そのため、ソースにファイルまたはフォルダーが追加された場合、削除されることなくターゲットに同期されます。

rsyncソース ファイルからバックアップを作成し、find ... rm一定期間またはファイルのサイズでファイルを削除する場合に使用することをお勧めします。

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

上記のコード ブロックは、ソースからバックアップを作成し、最終変更時刻が 2 か月を超えるすべてのファイルを削除します。

アップデート

オプションは TARGET のみを対象としておりdelete、ソースから一部のファイルが削除された場合は、rsync --deleteTARGET からも削除します。また、man ページに記載されているように、deleteおよび のオプションは次のとおりですafterbefore

--delete-before         receiver deletes before transfer, not during

という意味です:

  1. rsync は、SOURCE から削除されたファイルを TARGET から削除します。
  2. rsync はファイルの同期を開始します。
--delete-after          receiver deletes after transfer, not during

という意味です:

  1. rsync はファイルの同期を開始します。
  2. rsync は、同期後に SOURCE から削除されたファイルを TARGET から削除します。

注記:--delete-{before/after}ターゲットにだけ実装します。

答え3

コマンド

$ rsync -avhn --delete local/ remote/

ローカルで行われた変更をリモートに常に同期するように注意します。つまり、同期に注意します地元そしてリモートそのような

  1. ファイル追加した地元追加されるリモート
  2. ファイル削除されたから地元削除されるリモート
  3. ファイル追加したリモート削除される
  4. ファイル削除されたからリモート復元された地元存在する場合は無視される

パラメータの説明:

  • -aアーカイブモード
  • -v冗長性を高める
  • -h人間が読める形式で数値を出力する
  • -nドライ ランでは、変更を加えずに試運転を実行します。データの損失を防ぐために、常にこのフラグを最初に使用してください。満足したら削除してください。

結果がそれを物語っています:

  • 2つのディレクトリを作成する

    $ mkdir local/ remote/
    
  • そこにファイルを作成する

    $ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
    
  • 作成されたものを見る(rsyncの前):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  remote_only
    
  • rsync の呼び出し:

    $ rsync -avh --delete local/ remote/
    sending incremental file list
    deleting remote_only
    local_only
    
    sent 160 bytes  received 50 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
    
  • 結果を見る(rsync後):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  local_only
    

ご覧のとおり、このファイルはリモート/リモートのみされている削除されました、 ファイルローカル/ローカルのみされている同期した

答え4

rsync scync 中にエラーが発生した場合、、、または を--delete使用しても、rsync は必要なファイルを適切に削除しません。--delete-after--delete-before

このため、rsync エラーに対処することが重要です。

私のエラーのほとんどは、--permsLinux 以外のファイル システムと同期しているときに オプションを使用したことが原因でした。--permsを に置き換えると--no-perms、それらのエラーはなくなり、削除が機能しました。

--permsLinuxファイルシステムから別のLinuxファイルシステムに同期する場合は問題ありませんが、Linuxから非Linuxファイルシステム(NTFS、FATなど)に同期する場合は--permsエラーが発生します。rsync は Linux 以外のファイルシステムに Linux 権限を設定できません再度言いますが、エラー = 削除なしです。

-- Linux 以外のパーティションに同期する場合、、、またはを--no-perms妨害するエラーを回避するために を使用します--delete--delete-after--delete-before

その後もエラーが発生し、そのエラーを解消する方法がわからない場合は、同期していないファイルを削除すること専用のコマンドを実行できます。

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

上記のコマンドは、同期されていないものを削除しますが、ファイルは同期しません。そのため、この後、再度同期する必要があります。このコマンドは、これに基づいています。答えただし、引数も追加したので--ignore-errors、エラーがあっても削除されます。

関連情報