rsync 搬移檔案前先預演:確認來源斜線與目標覆寫
搬移網站檔案時,rsync 可以只傳送需要更新的項目,但一個來源路徑的結尾斜線,就可能改變目錄層級。先用空的測試目錄理解預期結果,再對正式資料進行有備份的操作。
先看來源斜線的差別
假設來源是 /srv/site/uploads,目標是已存在的 /backup/test。來源結尾有斜線時,複製 uploads 目錄內的內容到目標;沒有斜線時,通常會在目標下建立 uploads 目錄。兩端皆應先確認真實路徑與掛載狀態。
rsync -avni /srv/site/uploads/ /backup/test/
-n 是 dry-run,-i 列出變更摘要,-a 使用 archive 模式,-v 顯示詳細資訊。這個指令只是預演,不會實際傳送檔案;請逐項核對輸出的路徑與方向。archive 模式包含權限、時間與符號連結等行為,但不等同保存所有 ACL、extended attributes 或硬連結,需依環境另行評估。
在隔離目標實際驗證
確認測試目標可寫、空間足夠,且現有內容有獨立備份後,對相同來源與目標移除 -n 執行。以下僅限自己的測試資料:
rsync -avi /srv/site/uploads/ /backup/test/
rsync -avni /srv/site/uploads/ /backup/test/
第二次預演若沒有待更新項目,表示依 rsync 預設比較方式沒有發現差異;這不等同逐位元驗證。可針對固定且不再變動的檔案額外比對 SHA-256,並檢查目錄、檔案數和應用程式是否讀得到。來源持續寫入時,預演與實際結果可能不同,資料庫應採用一致性備份方式。
覆寫風險與復原
rsync 可能覆寫目標上同名檔案;預演不是備份。本文刻意不使用 –delete:它會刪除目標端多餘檔案,必須另行評估與預演。若發現方向或層級不對,停止操作並從事前驗證過的獨立備份還原;覆寫後無法靠再跑一次 rsync 自動復原。完整選項請看 rsync 官方手冊,備份流程可參考使用 7-Zip 加密網站備份。
讀懂 dry-run 的實際輸出
例如來源有 logo.png 而目標尚未有該檔,預演可能顯示 >f+++++++++ logo.png;其中 > 表示傳向接收端、f 表示一般檔案,連續加號表示新增。若顯示 .d..t...... ./,表示目錄屬性例如時間可能要更新。實際字元取決於版本和檔案狀態,完整對照以手冊的 itemize-changes 為準。
看到預期之外的成千上萬筆、目標前綴不對或權限錯誤時,先停下。檢查來源及目標各自的 pwd、ls -ld 與 df -h;若目標是外接磁碟或網路掛載,還要用 findmnt 確認掛載點,避免把資料寫到系統碟上的空目錄。
範例:比較指定檔案與備份
sha256sum /srv/site/uploads/logo.png /backup/test/logo.png
rsync -avnic /srv/site/uploads/ /backup/test/
在來源與目標檔案已停止變更的條件下,前兩個 SHA-256 雜湊相同是該單一檔案內容相同的證據;不同則須檢查複製過程與檔案是否仍在變更。第二行加 -c 可讓 rsync 以 checksum 決定檔案是否需要更新,但會讀取檔案,對大量資料可能耗時且增加磁碟負載。它仍是預演,並不會修正差異。
如果誤覆寫了目標,先停止後續同步、保留現況,從獨立備份還原受影響檔案到隔離目錄並核對,再依應用程式權限恢復。不要把來源反向同步回目標當作復原:來源也可能已變更或不是原始版本。








臉書留言
一般留言