rsync备份应先--include再--exclude,用--include="*/"确保目录遍历,配合--exclude-from集中管理编译产物;调试必用--dry-run -v验证规则匹配效果。

在批量备份源码时,用好 --include 和 --exclude 规则,关键不是“全选再删”,而是“只选真正需要的”——编译产物(如 .o、.class、build/、target/、node_modules/)本身就不该进入同步流程,提前拦住它们,备份才干净、快速、可复现。
明确规则优先级:include 必须写在 exclude 前面
rsync 按顺序逐条匹配,**遇到第一个匹配的规则就停止判断**。如果先写 --exclude="*",后面所有 --include 都无效。
- ✅ 正确写法(先保重点,再兜底排除):
rsync -a --include="*/" --include="*.java" --include="*.py" --include="Makefile" --include="pom.xml" --exclude="*" src/ backup/ - ❌ 错误写法(兜底太早,包含失效):
rsync -a --exclude="*" --include="*.java" src/ backup/→ 实际什么都不会同步
目录与文件要分开处理:用 "*/" 显式包含子目录
rsync 默认不递归进入未被明确允许的目录。只写 --include="*.java" 不会进入 src/main/java/,因为该目录本身没被包含。
- 必须加
--include="*/"允许遍历所有子目录(注意末尾斜杠表示目录) - 若只想进特定层级,比如只同步
src/下一级的java/和resources/,可写:--include="/java/" --include="/resources/" --include="/java/**" --include="/resources/**" -
**表示任意深度子路径,*只匹配单层;/name/是绝对路径匹配(从源根开始),name/是相对路径匹配
精准排除常见编译产物和临时文件
不必一条条列 --exclude,集中管理更可靠。推荐用 --exclude-from=filter.txt:
- filter.txt 示例内容:
# 编译输出build/target/out/bin/
# 中间文件*.o*.class*.pyc*.so
# 依赖目录node_modules/venv/__pycache__/ - 执行命令:
rsync -a --include="*/" --include="*.java" --include="*.xml" --include="*.yml" --include="Dockerfile" --exclude-from=filter.txt src/ backup/
验证过滤效果:用 --dry-run 先看不真传
加 --dry-run -v 能清晰看到哪些文件被包含、哪些被跳过,是调试规则最安全的方式:
- 运行:
rsync -avn --include="*/" --include="*.go" --exclude="*" ./src/ ./backup/ - 输出中带
>f+++++++++表示将传输,>f..t......表示跳过(因规则匹配),.d..t......表示跳过目录 —— 一眼识别漏配或误配 - 确认无误后再去掉
n参数正式执行

















