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 跳過時間戳記同步。