如何讓 rsync 刪除已從來源資料夾中刪除的檔案?

如何讓 rsync 刪除已從來源資料夾中刪除的檔案?

我最近設定了一台裝有 Ubuntu Server 的機器來託管遊戲伺服器。我為每個遊戲伺服器安裝了一個備份插件,該插件會在電腦上的特定資料夾中創建遊戲世界檔案的頻繁備份。我還制定了一項cron任務,每天晚上使用帶有選項的 rsync 自動將這些備份複製到我的 Dropbox 資料夾中-a

幾個月後,我的 Dropbox 帳戶達到了儲存限制,我意識到我無法保留這麼多備份,因此我將遊戲伺服器備份插件配置為不保留這麼多備份,然後等了幾天看看是否可以按照計劃每週刪除舊的備份。備份插件最終完成了它的工作並刪除了舊的備份,因此我期望rsynccron 任務隨後從我的 Dropbox 資料夾中刪除舊的備份以匹配來源資料夾,但它沒有這樣做。所以我有幾個問題:

  • 預設情況下,rsync僅執行添加將已新增至來源資料夾的檔案複製到目標資料夾,並且改變來源資料夾中已更改的文件,但不刪除從來源資料夾中刪除的檔案?

  • 如果是這樣的話,最好的方法是什麼rsync?我希望目標資料夾能夠完美反映來源資料夾,這意味著刪除已從來源資料夾中刪除的所有檔案。

我看到手冊頁中列出的一些選項rsync可能會起作用,但因為我不熟悉。

答案1

若要刪除目標中的文件,請將該--delete選項新增至您的命令中。例如:

rsync -avh source/ dest/ --delete

注意:-avh是為了--archive --verbose --human-readable

答案2

同步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

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

意思是:

  1. rsync 從 TARGET 中刪除從 SOURCE 中刪除的檔案。
  2. rsync 開始同步檔案。
--delete-after          receiver deletes after transfer, not during

意思是:

  1. rsync 開始同步檔案。
  2. rsync 從 TARGET 中刪除同步後從 SOURCE 刪除的檔案。

筆記:該--delete-{before/after}工具僅在 TARGET 中。

答案3

命令

$ rsync -avhn --delete local/ remote/

注意始終將本地完成的變更同步回遠端。這意味著需要注意同步當地的偏僻的這樣

  1. 文件添加當地的被添加到偏僻的
  2. 文件已刪除當地的被移除自偏僻的
  3. 文件添加偏僻的被刪除
  4. 文件已刪除偏僻的恢復自當地的如果存在,則忽略

參數解釋:

  • -a存檔模式
  • -v增加冗長
  • -h以人類可讀的格式輸出數字
  • -ndry run,在不做任何更改的情況下執行試運行。最初始終使用此標誌以防止資料遺失。當你高興的時候,就把它去掉。

讓結果說明一切:

  • 建立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
    
  • 查看結果(同步後):

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

如您所見,該文件遠端/僅限遠端已經已刪除, 文件本地/僅限本地已經同步的

答案4

如果 rsync 同步過程中出現任何錯誤,rsync 將無法正確刪除其應有的文件,即使您使用了--delete--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還添加了參數,所以即使有錯誤它也會刪除。

相關內容