web-dev-qa-db-ja.com

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

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

数か月後、Dropboxアカウントがストレージの上限に達し、あまり多くのバックアップを保持できないことに気づいたので、あまり多くのバックアップを保持しないようにゲームサーバーのバックアッププラグインを構成し、数日待って毎週実行するようにスケジュールされている古いバックアップを削除します。バックアッププラグインは最終的にそのジョブを実行し、古いバックアップを削除したので、rsync cronタスクがその後、Dropboxフォルダーから古いバックアップを削除してソースフォルダーと一致することを期待していましたが、そうしませんでした。質問がいくつかあります。

  • デフォルトでは、rsyncのみaddソースフォルダーに追加された宛先フォルダーへのファイルとchangeソースフォルダー内で変更されたファイルNOT deleteソースフォルダーから削除されたファイル?

  • その場合、rsyncにこれを実行させる最良の方法は何ですか?移行先フォルダーに移行元フォルダーを完全に反映させたいので、移行元フォルダーから削除されたファイルをすべて削除する必要があります。

rsyncのマニュアルページに、トリックを行う可能性のあるいくつかのオプションが表示されていますが、私はよく知らないので。

187
user254251

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

rsync -avh source/ dest/ --delete
219
GarethD

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

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

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

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

UPDATE

deleteオプションはTARGET専用であり、一部のファイルがソースから削除された場合、rsync --deleteはTARGETからそれらを削除します。 deleteおよびafterによるbeforeオプションは、マニュアルページで説明されています。

--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からファイルを削除します。

NOTE--delete-{before/after}はTARGETだけで実装します。

44
shgnInc

このコマンドは、増分データをコピーし、リモートサーバーとの同期を維持します。

  1. 増分データのみをコピーします。
  2. ソースからデータが削除されると削除されます。
  3. 宛先でデータが削除された場合、ソースから再びコピーされます。
  4. 基本的に、このコマンドは両方の環境の同期を維持します。

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

例:

rsync -avWe ssh --delete-before /data [email protected]:/backup
rsync -avW --delete-before -e ssh /data [email protected]:/backup
6
Ganesh Ghube

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

これが、rsyncエラーに対処することが重要である理由です。

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

--permsは、Linuxファイルシステムから別のLinuxファイルシステムに同期する場合は問題ありませんが、Linuxから非Linuxファイルシステム(NTFS、FATなど)に同期する場合は、--permsrsyncは非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

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

0
Lonnie Best