chaterm

rsync

rsync 文件同步与备份

chaterm 57 12 Updated 7mo ago
GitHub

Install

npx skillscat add chaterm/terminal-skills/rsync

Install via the SkillsCat registry.

About this skill

rsync is a command-line utility that synchronizes files locally and remotely, using incremental transfers to reduce bandwidth. It solves the problem of keeping directory copies consistent across machines or backup locations. Use it when you need efficient file backup, mirroring, or remote data transfer.

SKILL.md

rsync 文件同步与备份

概述

rsync 是强大的文件同步工具,支持增量传输、远程同步、备份等场景。

基础用法

# 本地同步
rsync -av source/ dest/

# 远程同步(推送)
rsync -av source/ user@remote:/path/dest/

# 远程同步(拉取)
rsync -av user@remote:/path/source/ dest/

# 常用参数
# -a  归档模式(保留权限、时间等)
# -v  详细输出
# -z  压缩传输
# -P  显示进度 + 断点续传
# -n  模拟运行(dry-run)

常用参数组合

# 标准备份
rsync -avz source/ dest/

# 带进度显示
rsync -avzP source/ dest/

# 删除目标多余文件(镜像同步)
rsync -avz --delete source/ dest/

# 排除文件
rsync -avz --exclude='*.log' --exclude='.git' source/ dest/

# 使用排除文件
rsync -avz --exclude-from='exclude.txt' source/ dest/

# 限制带宽(KB/s)
rsync -avz --bwlimit=1000 source/ dest/

远程同步

# 通过 SSH(默认)
rsync -avz -e ssh source/ user@host:/path/

# 指定 SSH 端口
rsync -avz -e 'ssh -p 2222' source/ user@host:/path/

# 使用 SSH 密钥
rsync -avz -e 'ssh -i ~/.ssh/key' source/ user@host:/path/

# rsync daemon 模式
rsync -avz source/ rsync://user@host/module/

备份策略

增量备份

# 使用硬链接实现增量备份
rsync -avz --link-dest=/backup/latest source/ /backup/$(date +%Y%m%d)/

# 更新 latest 链接
ln -snf /backup/$(date +%Y%m%d) /backup/latest

定时备份脚本

#!/bin/bash
set -euo pipefail

SOURCE="/data/"
DEST="/backup/"
DATE=$(date +%Y%m%d_%H%M%S)
LATEST="$DEST/latest"
BACKUP="$DEST/$DATE"

# 增量备份
rsync -avz --delete --link-dest="$LATEST" "$SOURCE" "$BACKUP"

# 更新 latest 链接
ln -snf "$BACKUP" "$LATEST"

# 保留最近 7 天
find "$DEST" -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;

常见场景

场景 1:网站文件同步

# 同步网站文件,排除缓存和日志
rsync -avz --delete \
  --exclude='cache/' \
  --exclude='*.log' \
  --exclude='uploads/tmp/' \
  /var/www/html/ backup@remote:/backup/www/

场景 2:数据库备份同步

# 先导出数据库
mysqldump -u root -p database > /backup/db.sql

# 同步到远程
rsync -avzP /backup/db.sql backup@remote:/backup/mysql/

场景 3:断点续传大文件

# 使用 -P 参数支持断点续传
rsync -avzP large_file.tar.gz user@remote:/path/

# 如果中断,重新执行相同命令即可继续

故障排查

问题 解决方法
权限错误 检查目标目录权限,使用 --chmod
连接超时 检查网络、SSH 配置、防火墙
空间不足 清理目标磁盘,使用 --max-size 限制
同步慢 使用 -z 压缩,--bwlimit 限速
文件被跳过 检查 --exclude 规则,使用 -v 查看详情

注意事项

# 源路径末尾的 / 很重要!
rsync -av source/ dest/   # 同步 source 目录内容到 dest
rsync -av source dest/    # 同步 source 目录本身到 dest/source

# 先用 -n 模拟
rsync -avzn --delete source/ dest/

# 确认无误后执行
rsync -avz --delete source/ dest/