$npx -y skills add chaterm/terminal-skills --skill rsyncrsync 文件同步与备份
| 1 | # rsync 文件同步与备份 |
| 2 | |
| 3 | ## 概述 |
| 4 | rsync 是强大的文件同步工具,支持增量传输、远程同步、备份等场景。 |
| 5 | |
| 6 | ## 基础用法 |
| 7 | |
| 8 | ```bash |
| 9 | # 本地同步 |
| 10 | rsync -av source/ dest/ |
| 11 | |
| 12 | # 远程同步(推送) |
| 13 | rsync -av source/ user@remote:/path/dest/ |
| 14 | |
| 15 | # 远程同步(拉取) |
| 16 | rsync -av user@remote:/path/source/ dest/ |
| 17 | |
| 18 | # 常用参数 |
| 19 | # -a 归档模式(保留权限、时间等) |
| 20 | # -v 详细输出 |
| 21 | # -z 压缩传输 |
| 22 | # -P 显示进度 + 断点续传 |
| 23 | # -n 模拟运行(dry-run) |
| 24 | ``` |
| 25 | |
| 26 | ## 常用参数组合 |
| 27 | |
| 28 | ```bash |
| 29 | # 标准备份 |
| 30 | rsync -avz source/ dest/ |
| 31 | |
| 32 | # 带进度显示 |
| 33 | rsync -avzP source/ dest/ |
| 34 | |
| 35 | # 删除目标多余文件(镜像同步) |
| 36 | rsync -avz --delete source/ dest/ |
| 37 | |
| 38 | # 排除文件 |
| 39 | rsync -avz --exclude='*.log' --exclude='.git' source/ dest/ |
| 40 | |
| 41 | # 使用排除文件 |
| 42 | rsync -avz --exclude-from='exclude.txt' source/ dest/ |
| 43 | |
| 44 | # 限制带宽(KB/s) |
| 45 | rsync -avz --bwlimit=1000 source/ dest/ |
| 46 | ``` |
| 47 | |
| 48 | ## 远程同步 |
| 49 | |
| 50 | ```bash |
| 51 | # 通过 SSH(默认) |
| 52 | rsync -avz -e ssh source/ user@host:/path/ |
| 53 | |
| 54 | # 指定 SSH 端口 |
| 55 | rsync -avz -e 'ssh -p 2222' source/ user@host:/path/ |
| 56 | |
| 57 | # 使用 SSH 密钥 |
| 58 | rsync -avz -e 'ssh -i ~/.ssh/key' source/ user@host:/path/ |
| 59 | |
| 60 | # rsync daemon 模式 |
| 61 | rsync -avz source/ rsync://user@host/module/ |
| 62 | ``` |
| 63 | |
| 64 | ## 备份策略 |
| 65 | |
| 66 | ### 增量备份 |
| 67 | ```bash |
| 68 | # 使用硬链接实现增量备份 |
| 69 | rsync -avz --link-dest=/backup/latest source/ /backup/$(date +%Y%m%d)/ |
| 70 | |
| 71 | # 更新 latest 链接 |
| 72 | ln -snf /backup/$(date +%Y%m%d) /backup/latest |
| 73 | ``` |
| 74 | |
| 75 | ### 定时备份脚本 |
| 76 | ```bash |
| 77 | #!/bin/bash |
| 78 | set -euo pipefail |
| 79 | |
| 80 | SOURCE="/data/" |
| 81 | DEST="/backup/" |
| 82 | DATE=$(date +%Y%m%d_%H%M%S) |
| 83 | LATEST="$DEST/latest" |
| 84 | BACKUP="$DEST/$DATE" |
| 85 | |
| 86 | # 增量备份 |
| 87 | rsync -avz --delete --link-dest="$LATEST" "$SOURCE" "$BACKUP" |
| 88 | |
| 89 | # 更新 latest 链接 |
| 90 | ln -snf "$BACKUP" "$LATEST" |
| 91 | |
| 92 | # 保留最近 7 天 |
| 93 | find "$DEST" -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \; |
| 94 | ``` |
| 95 | |
| 96 | ## 常见场景 |
| 97 | |
| 98 | ### 场景 1:网站文件同步 |
| 99 | ```bash |
| 100 | # 同步网站文件,排除缓存和日志 |
| 101 | rsync -avz --delete \ |
| 102 | --exclude='cache/' \ |
| 103 | --exclude='*.log' \ |
| 104 | --exclude='uploads/tmp/' \ |
| 105 | /var/www/html/ backup@remote:/backup/www/ |
| 106 | ``` |
| 107 | |
| 108 | ### 场景 2:数据库备份同步 |
| 109 | ```bash |
| 110 | # 先导出数据库 |
| 111 | mysqldump -u root -p database > /backup/db.sql |
| 112 | |
| 113 | # 同步到远程 |
| 114 | rsync -avzP /backup/db.sql backup@remote:/backup/mysql/ |
| 115 | ``` |
| 116 | |
| 117 | ### 场景 3:断点续传大文件 |
| 118 | ```bash |
| 119 | # 使用 -P 参数支持断点续传 |
| 120 | rsync -avzP large_file.tar.gz user@remote:/path/ |
| 121 | |
| 122 | # 如果中断,重新执行相同命令即可继续 |
| 123 | ``` |
| 124 | |
| 125 | ## 故障排查 |
| 126 | |
| 127 | | 问题 | 解决方法 | |
| 128 | |------|----------| |
| 129 | | 权限错误 | 检查目标目录权限,使用 `--chmod` | |
| 130 | | 连接超时 | 检查网络、SSH 配置、防火墙 | |
| 131 | | 空间不足 | 清理目标磁盘,使用 `--max-size` 限制 | |
| 132 | | 同步慢 | 使用 `-z` 压缩,`--bwlimit` 限速 | |
| 133 | | 文件被跳过 | 检查 `--exclude` 规则,使用 `-v` 查看详情 | |
| 134 | |
| 135 | ## 注意事项 |
| 136 | |
| 137 | ```bash |
| 138 | # 源路径末尾的 / 很重要! |
| 139 | rsync -av source/ dest/ # 同步 source 目录内容到 dest |
| 140 | rsync -av source dest/ # 同步 source 目录本身到 dest/source |
| 141 | |
| 142 | # 先用 -n 模拟 |
| 143 | rsync -avzn --delete source/ dest/ |
| 144 | |
| 145 | # 确认无误后执行 |
| 146 | rsync -avz --delete source/ dest/ |
| 147 | ``` |