这个场景解决什么
配置对比在两个时刻最有用:发布前确认改动内容符合预期,以及巡检时核对多台机器的配置是否一致。小文件直接 diff 最直观;顺序不敏感的配置(规则列表、include 清单)先排序再比,能过滤掉纯粹的排列差异;整个目录用递归对比或干跑同步,得到的是一份可执行的文件级差异清单。
基本信息
| 场景 | 对比两份配置、两台机器或两个目录的差异 |
|---|---|
| 工具组合 | diff 系列、sort 预处理、rsync 干跑、摘要比对 |
| 关键前提 | 比对前统一行尾与字符集,否则满屏都是假差异 |
| 输出建议 | 统一用统一格式(-u),便于评审与存档 |
典型使用场景
- 发布评审:把新配置与线上版本对比,确认只改了预期的那几行
- 多机一致性巡检:抽查若干台机器的同名配置是否一致
- 故障复盘:对比故障前后的配置快照,判断是否有隐性改动
- 迁移核对:迁移到新环境后确认配置项一条不落
- 快速定位差异文件:用摘要比对先找出内容不同的文件,再逐个查看
文件与远程对比
文件与远程对比
diff -u app.conf app.conf.new | less
ssh web1 'cat /etc/nginx/nginx.conf' | diff -u /etc/nginx/nginx.conf - | less
diff -y --width=160 a.conf b.conf | grep -n '|' | head # 并排视图
diff -q -r /etc/app /data/backup/app # 只报哪些文件不同
diff -u --strip-trailing-cr win.conf linux.conf | head # 忽略行尾差异顺序不敏感与目录级对比
顺序不敏感与目录级对比
sort /etc/app/rules.conf > /tmp/a.txt
ssh web2 'sort /etc/app/rules.conf' > /tmp/b.txt
diff -u /tmp/a.txt /tmp/b.txt
diff -u <(sort a.conf) <(sort b.conf) | head # 进程替换,少写临时文件
rsync -navc /etc/app/ web2:/etc/app/ # -n 只看不写,-c 按内容校验
find /etc/app -type f -exec sha256sum {} + | sort > /tmp/h1.txt # 摘要清单比对diff 常用选项
| 选项 | 作用 | 使用建议 |
|---|---|---|
| -u | 统一格式输出 | 评审与存档的首选格式 |
| -y | 并排显示 | 人工快速扫差异 |
| -q | 只报告是否不同 | 批量筛查时用 |
| -r | 递归比较目录 | 整目录对比 |
| -w / -b | 忽略空白差异 | 格式美化导致的假差异 |
| -i | 忽略大小写 | 配置项大小写不规范时 |
| --strip-trailing-cr | 忽略行尾回车 | 跨平台文件对比必备 |
排序后对比会丢掉顺序信息。配置顺序敏感(路由规则、include 顺序)时,先做原始对比,再做排序对比,两步结合才能同时看到「有差异」与「差异是否只是顺序」。
比对前先对齐行尾与字符集,否则 Windows 行尾与 UTF-8 之外编码会产生大量假差异,把真正的改动淹没掉。