背景
我们正在从手动管理主机转向配置管理。
20 个文件
我想比较 20 个主机的配置文件 20 次。例如/etc/crontab
用例
我猜 20 个文件中大约有 15 个是相同的。我想查看用“vi”手动修改的 5 个文件。
我想要一个概述,没有像修补这样的自动化操作......
如何比较它们...?
我尝试了我最喜欢的 diff 工具 (meld),但是它不允许超过三个文件 :-(
答案1
我试图弄清楚将 20 个文件相互差异化会达到什么效果,但也许我还有其他方法。
我假设您想知道您的所有系统上定义了哪些类型的 cron 作业。我建议不要比较这些文件的差异,而是将它们一起输出,sort
然后使用输出uniq
来省略重复的行:
文件1:
10 10 * * * /myjob.sh
* * * * * /everyminute.sh
文件2:
20 20 * * * /evening-job.sh
* * * * * /everyminute.sh
所有文件的所有作业:
cat File1 File2 | sort | uniq -c
1 10 10 * * * /myjob.sh
1 20 20 * * * /evening-job.sh
2 * * * * * /everyminute.sh
第一列显示此作业被定义的次数。
答案2
Sven 的方法可能更适合差异很大的文件。但如果真的只有 5 个文件是唯一的,我宁愿做其他事情……查看整个文件,而不是一些带有计数的编码内容。
计算它们的校验和并显示名称和计数。然后,您可能会得到例如 5 个不同版本的文件,然后您可以更轻松地将每个文件与第一个文件进行比较,每次比较一个,共 4 次。
sha1sum files/* | sort | uniq -c
vimdiff files/file1 files/file2
# FYI short syntax of above (bash):
vimdiff files/file{1,2}
如果结果太多,也许先删除不相关的内容,例如注释和空格。
mkdir /tmp/trimmed
cd /tmp/trimmed
for f in /path/to/files/*; do
n=$(basename "$f")
grep -Ev "^[ \t]*$|^[ \t]*#" "$f" > "$n".trimmed
done
sha1sum *.trimmed | sort | uniq -c
答案3
回答我自己的问题:
获取配置:
parallel -q -j0 scp {}:/etc/crontab tmp/crontab-{}.conf :::
展会概况:
md5sum tmp/crontab-* | sort
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
581cc593069e5a59cde886d7491e9cf4 tmp/[email protected]
94d1fdc2cc561aafec162209d2360f78 tmp/[email protected]
主机“bar”上的配置不同。请检查:
vimdiff tmp/[email protected] tmp/[email protected]