跳到主要内容

Linux Rsync 同步文件

你可以使用 rsync 命令来实现树莓派到云服务器的同步,包括删除和新增修改的文件。以下是详细的步骤和命令:


1. 基本同步命令

rsync -avz --delete /www/ user@云服务器IP:/www/

参数说明:

  • -a: 归档模式,保持文件属性、权限等
  • -v: 详细输出
  • -z: 压缩传输
  • --delete: 删除目标端源端不存在的文件

2. 更安全的同步方式(推荐)

先进行试运行,确认要同步的文件:

# 试运行,不实际同步
rsync -avz --delete --dry-run /www/ user@云服务器IP:/www/

确认无误后,移除 --dry-run 进行实际同步:

# 实际同步
rsync -avz --delete /www/ user@云服务器IP:/www/

3. 增强的同步命令

rsync -avz --delete --progress --stats /www/ user@云服务器IP:/www/

额外参数:

  • --progress: 显示传输进度
  • --stats: 显示传输统计信息

4. 排除不必要的文件

创建排除文件列表 exclude-list.txt

*.log
*.tmp
cache/
temp/
.DS_Store
.git/

然后使用排除列表:

rsync -avz --delete --exclude-from='exclude-list.txt' /www/ user@云服务器IP:/www/

5. 使用SSH密钥认证(推荐)

为了避免每次输入密码,设置SSH密钥认证:

# 在树莓派生成SSH密钥
ssh-keygen -t rsa

# 将公钥复制到云服务器
ssh-copy-id user@云服务器IP

6. 完整的部署脚本

创建脚本 deploy.sh

#!/bin/bash

# 配置变量
REMOTE_USER="用户名"
REMOTE_HOST="云服务器IP"
REMOTE_PATH="/www"
LOCAL_PATH="/www"

echo "开始同步到云服务器..."
echo "时间: $(date)"

# 试运行
echo "=== 试运行 ==="
rsync -avz --delete --dry-run --exclude-from='exclude-list.txt' "$LOCAL_PATH/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"

read -p "确认同步?(y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "同步取消"
exit 1
fi

# 实际同步
echo "=== 开始实际同步 ==="
rsync -avz --delete --progress --stats --exclude-from='exclude-list.txt' "$LOCAL_PATH/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"

echo "同步完成"
echo "时间: $(date)"

给脚本执行权限:

chmod +x deploy.sh

7. 定时自动同步(可选)

如果需要定时同步,可以设置cron任务:

# 编辑cron任务
crontab -e

# 添加以下行,每天凌晨2点同步
0 2 * * * /usr/bin/rsync -avz --delete --exclude-from=/path/to/exclude-list.txt /www/ user@云服务器IP:/www/ >> /var/log/rsync.log 2>&1

8. 验证同步结果

同步完成后,可以验证文件是否一致:

# 在云服务器上检查文件
ssh user@云服务器IP "find /www -type f | wc -l"

# 与本地比较
find /www -type f | wc -l

注意事项:

  1. 首次同步:如果数据量很大,首次同步可能需要较长时间
  2. 权限问题:确保云服务器的目标目录有写入权限
  3. 网络稳定性:如果网络不稳定,可以考虑使用 --partial 参数支持断点续传
  4. 备份重要数据:同步前建议备份云服务器上的重要数据

这样的设置可以确保你的树莓派测试通过后,能够快速、安全地将代码同步到云服务器。