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


194

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

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

  • 既定では、ソースフォルダーに追加されたファイルrsyncのみ宛先フォルダーに追加し、ソースフォルダーで変更されたファイルを変更しますが、ソースフォルダーから削除されたファイルは削除しませんか?

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

マニュアルページにいくつかのオプションがリストされていますが、rsyncそれはトリックを行う可能性がありますが、私は詳しくありません。

回答:


227

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

rsync -avh source/ dest/ --delete

15
ソースがディレクトリであることを確認してください。使用してsource/* dest/も動作しません。
トムサリーバ16

3
私はとそのイベントを見つけ--deleteたり--delete-after、それがためにいくつかのエラーを削除するものではありません:「IOエラーが発生した-ファイルの削除をスキップ」。解決するには、この追加--ignore-errorsオプションは、個別にエラーをデバッグ
MHT

12
完全に動作します!動作していても、特にこれらのようなオプションに関しては、-n, --dry-run実行する前に必ずオプションを使用することをお勧めrsyncします(--delete)。頭痛の種を避けることができます:)。
-ivanleoncz

2
@MHT:コメントなしでは完全な回答はありません。
ロニーベスト

2
@TheBicentennialManはを-a 意味し -rます。
x-yuri

45

rsyncあなたはいくつかのオプションを使用しながら、コマンドが文句を言わない任意のファイルを削除しdelete、そのコマンドに。そのため、ソースにファイルまたはフォルダーが追加された場合、削除せずにターゲットに同期されます。

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

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

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

更新

deleteオプションはTARGET専用であることがわかったため、一部のファイルがソースからrsync --delete削除された場合、TARGETから削除します。そして、deleteすることによりオプションafterbefore、そのmanページで述べたように:

--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}実装はTARGETのみです。


1
返信いただきありがとうございます!!rsyncの「削除」オプションを参照していますか?rsyncに「削除」オプションを使用できないのはなぜですか?
user254251 14年

@ user254251、deleteを使用すると、rsyncコマンドはすぐにファイルを削除します。ただし、この場合、エラーが発生する時間が長くなります。
shgnInc 14年

正しく理解していれば、エラーを避けるために削除タスクをrsyncタスクから分離する必要があると言っています。しかし、質問があります。rsyncのマニュアルページには、コピータスクの前または後に実行することで削除タスクを分離する目的に役立つと思われるいくつかのオプションがリストされています。たとえば、-delete-beforeと--delete-afterという2つのオプションがあります。これらのオプションを使用したrsyncは、説明した方法と同じ効果がありますか?マニュアルページで各オプションの完全な説明を読みましたが、説明には理解できない情報があります。
user254251 14年

@ user254251、回答が更新されました。rsyncの時間制限によってTARGETからファイルを削除する方法があるかどうかはわかりません。
shgnInc 14年

ありがとう!--delete-beforeオプションを使用するだけでエラーから安全だと思いますか?タイムアウトを指定していないので、rsync削除ステージが転送ステージを遅らせるかどうか心配する必要はありません。rsyncは1日に1回実行され、次の同期の前にバックアップファイルを同期するのに十分な時間なので、同期の時間を制限する必要もありません。
user254251 14年

6

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

  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 root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
-Wは、増分データのみをコピーするのではなく、常にファイル全体をコピーするようにします。
Tulainsコルドヴァ

私は、このコマンドを実行して、このエラーを得た: rsync: Failed to exec --delete-before: No such file or directory (2)
ジェフ・ティエン

1

何らかのエラーがのrsync scync中に存在する場合、rsyncが適切に使用した場合でも、それは持つべきファイルを削除しないであろう--delete--delete-afterまたは--delete-before

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

私のエラーのほとんどは、--perms非Linuxファイルシステムとの同期中にオプションを使用したことが原因でした。私が交換したとき--perms--no-perms、これらのエラーが離れて行き、その後、働い削除できます。

--permsLinuxファイルシステムから別のLinuxファイルシステムに同期する場合は問題ありませんが、Linuxから非Linuxファイルシステム(NTFS、FATなど)に同期--permsする場合、rsyncは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引数も追加したため、エラーがあっても削除されます。


1
ヒントをありがとう!私は5年前にこの質問の最初の著者です。これを投稿してくれて本当にうれしいです。近い将来にNTFSドライブへの同期を設定することを計画していたので、 rsync、(特に)アクセス許可を同期します。そこで、メモに「--no-perms」を追加しました。rsync -a --no-perms --delete-beforeを使用する予定です。質問があります:--delete-beforeは、同期の前に削除を実行することにより、ファイルの削除に関する問題を回避しませんか?それがその目的だと思った。
user254251

@ user254251-確信はありません。私はそれが本当に「前に削除」する早さにかかっていると思います。削除を開始する前に何らかのエラーが発生した場合は、ねじ込みます。あなたへの私のアドバイスは、あなたがあなたのお尻の鋭い痛みが好きでない限り、できる限りNTFSを避ける​​ことです:) NTFSからNTFSは正常に動作します。NTFS to Linixは正常に動作します。「Linuxファイルシステム」から「非Linuxファイルシステム」への移行は避けてください。削除が正常に機能することを確認するのは苦痛です。これは実現できますが、目的のドライブをEXT4としてフォーマットするよりも、トラブルに見合う価値はないと判断しました。
ロニーベスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.