Linux rsync 高效檔案同步與備份

scp 雖然簡單好用,但它是「傻瓜式」的複製。不管檔案有沒有變更,它都會全部重傳一次。用 scp 很方便。 但如果你要備份幾百 GB 的資料,或者是每次只有幾個檔案變動,用 scp 每次都重傳會瘋掉。

這時你要用 rsync (Remote Sync)。 它的最大特色是 「增量傳輸」:它會比對兩邊檔案的差異,只傳輸有變動的部分。

基本語法

scp 很像。

rsync [參數] [來源] [目的地]

最常用的參數組合 (-av)

通常我們只用這一招走天下:-av

  • a (archive):歸檔模式,等於 -rlptgoD 的縮寫。意思是遞迴備份,並盡可能保留原本所有的權限、時間、連結等屬性。
  • v (verbose):顯示過程。
# 把本機的 www 資料夾同步到伺服器
rsync -av www/ user@192.168.1.100:~/backup/www/

從遠端下載 (Remote -> Local)

scp 一樣,把位置反過來就好。

# 把伺服器上的 /var/log/nginx/ 下載回來本機的 logs/ 目錄
rsync -av user@192.168.1.100:/var/log/nginx/ ./logs/

路徑結尾的斜線 / 差異

這是新手最容易搞混的地方!

  • src/ (有斜線):代表同步「目錄裡面的內容」 (contents only)。
  • src (沒斜線):代表同步「這個目錄本身」 (directory itself)。

實用參數

--delete:刪除多餘檔案

如果來源端把檔案 A 刪了,你希望目的端也要跟著刪除 A,保持完全一致,就要加這個。 (請小心使用,因為會真的刪檔)

rsync -av --delete source/ destination/

--progress:顯示進度條

傳輸大檔案時,想看跑到幾 % 了。

rsync -av --progress big_file.iso user@host:~

-e ssh:指定 SSH

rsync 預設就是走 SSH,但如果你 SSH 有改 Port,可以這樣指定:

rsync -av -e "ssh -p 2222" source/ destination/