
最近、ゲーム サーバーをホストするために 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 --delete
TARGET からも削除します。また、man ページに記載されているように、delete
および のオプションは次のとおりですafter
。before
--delete-before receiver deletes before transfer, not during
という意味です:
- rsync は、SOURCE から削除されたファイルを TARGET から削除します。
- rsync はファイルの同期を開始します。
--delete-after receiver deletes after transfer, not during
という意味です:
- rsync はファイルの同期を開始します。
- rsync は、同期後に SOURCE から削除されたファイルを TARGET から削除します。
注記:--delete-{before/after}
ターゲットにだけ実装します。
答え3
コマンド
$ rsync -avhn --delete local/ remote/
ローカルで行われた変更をリモートに常に同期するように注意します。つまり、同期に注意します地元そしてリモートそのような
- ファイル追加したで地元追加されるリモート
- ファイル削除されたから地元削除されるリモート
- ファイル追加したでリモート削除される
- ファイル削除されたからリモート復元された地元存在する場合は無視される
パラメータの説明:
-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 エラーに対処することが重要です。
私のエラーのほとんどは、--perms
Linux 以外のファイル システムと同期しているときに オプションを使用したことが原因でした。--perms
を に置き換えると--no-perms
、それらのエラーはなくなり、削除が機能しました。
--perms
Linuxファイルシステムから別の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
、エラーがあっても削除されます。