rsync — 高效率增量同步工具

高效增量同步檔案,只傳輸變更的部分,支援本機與遠端。

語法

rsync [選項] 來源 目的地

常用選項

選項 說明 範例
-a, --archive 歸檔模式:等同 -rlptgoD(遞迴+保留屬性) rsync -a src/ dst/
-v, --verbose 顯示傳輸的每個檔案 rsync -av src/ dst/
-z, --compress 傳輸時壓縮(節省頻寬,適合遠端同步) rsync -avz src/ user@host:/dst/
-P 等同 --progress --partial(顯示進度+斷點續傳) rsync -avP src/ dst/
--delete 刪除目的地有但來源沒有的檔案(鏡像同步) rsync -av --delete src/ dst/
--dry-run / -n 模擬執行,只顯示會做什麼,不實際操作 rsync -avn src/ dst/
--exclude=樣式 排除符合樣式的檔案 rsync -av --exclude='*.log' src/ dst/
--exclude-from=檔案 從檔案讀取排除樣式列表 rsync -av --exclude-from=.rsyncignore src/ dst/
-e ssh 指定使用 SSH,可加選項 rsync -avz -e 'ssh -p 2222' src/ user@host:/dst/
--bwlimit=Kbps 限制傳輸頻寬 rsync --bwlimit=5000 src/ dst/
-u, --update 跳過目的地比來源新的檔案 rsync -avu src/ dst/
--checksum 依校驗碼(而非修改時間)判斷是否需要傳輸 rsync -avc src/ dst/

使用範例

範例 1:本機同步(備份目錄)

將 /data/ 同步到 /backup/(注意來源路徑結尾的斜線)。

$ rsync -avP /data/ /backup/data/
sending incremental file list
./
config.yml
   4,096 100%    0.00kB/s    0:00:00  done
big-file.tar.gz
 104,857,600 100%   45.23MB/s   0:00:02  done

sent 104,862,050 bytes  received 42 bytes  52,431,046.00 bytes/sec
範例 2:遠端同步(常用的備份指令)

將本機 /var/www/ 同步到遠端伺服器,-z 壓縮,--delete 保持鏡像。

$ rsync -avz --delete /var/www/ user@backup-server:/var/backups/www/
範例 3:模擬執行(先確認再實際操作)

加上 --dry-run 或 -n 只顯示會做什麼,不實際執行,常用於確認 --delete 的影響。

$ rsync -avn --delete /data/ /backup/
deleting old-folder/
old-file.log
(dry run) sending incremental file list
範例 4:排除特定目錄與檔案

同步時排除 node_modules、.git 和日誌檔案。

$ rsync -avz \
  --exclude='node_modules/' \
  --exclude='.git/' \
  --exclude='*.log' \
  ./project/ user@server:/var/www/project/
範例 5:部署 Web 應用

常見的部署模式:先 dry-run 確認,再實際同步。

$ rsync -avz --dry-run --delete ./build/ user@prod:/var/www/html/
# 確認沒問題後去掉 --dry-run 再執行

常見錯誤與排錯

來源路徑結尾有/無斜線的差異
原因
rsync 對斜線非常敏感:rsync src/ dst/ 複製 src 的「內容」;rsync src dst/ 複製 src 這個「目錄」到 dst 下。
解法
記住:來源路徑末尾有 / 代表「同步目錄的內容」,沒有 / 代表「同步目錄本身」。
rsync: failed to set times on ... : Operation not permitted
原因
目的地檔案系統不支援設定時間戳記(如 FAT32 或部分 NFS)。
解法
加上 --no-times 或 -O 跳過時間戳記同步。

延伸閱讀