
我最近設定了一台裝有 Ubuntu Server 的機器來託管遊戲伺服器。我為每個遊戲伺服器安裝了一個備份插件,該插件會在電腦上的特定資料夾中創建遊戲世界檔案的頻繁備份。我還制定了一項cron
任務,每天晚上使用帶有選項的 rsync 自動將這些備份複製到我的 Dropbox 資料夾中-a
。
幾個月後,我的 Dropbox 帳戶達到了儲存限制,我意識到我無法保留這麼多備份,因此我將遊戲伺服器備份插件配置為不保留這麼多備份,然後等了幾天看看是否可以按照計劃每週刪除舊的備份。備份插件最終完成了它的工作並刪除了舊的備份,因此我期望rsync
cron 任務隨後從我的 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
的選項,如其手冊頁所述:after
before
--delete-before receiver deletes before transfer, not during
意思是:
- rsync 從 TARGET 中刪除從 SOURCE 中刪除的檔案。
- rsync 開始同步檔案。
--delete-after receiver deletes after transfer, not during
意思是:
- rsync 開始同步檔案。
- rsync 從 TARGET 中刪除同步後從 SOURCE 刪除的檔案。
筆記:該--delete-{before/after}
工具僅在 TARGET 中。
答案3
命令
$ rsync -avhn --delete local/ remote/
注意始終將本地完成的變更同步回遠端。這意味著需要注意同步當地的和偏僻的這樣
- 文件添加在當地的被添加到偏僻的
- 文件已刪除從當地的被移除自偏僻的
- 文件添加在偏僻的被刪除
- 文件已刪除從偏僻的恢復自當地的如果存在,則忽略
參數解釋:
-a
存檔模式-v
增加冗長-h
以人類可讀的格式輸出數字-n
dry 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
還添加了參數,所以即使有錯誤它也會刪除。