【问题标题】:Creating a script that compares multiple files in multiple servers创建一个比较多个服务器中的多个文件的脚本
【发布时间】:2013-07-06 11:24:30
【问题描述】:
我有几个不同的 linux 服务器,它们本质上都是彼此的镜像。但是,其中一些已经不同步(机器 1 中的文件 A 与机器 2 中的文件 B 不同)。
我正在设计一个脚本(仅限shell 或Perl),它将系统地遍历某些目录并将不同机器中的相应文件相互比较,并生成有意义的报告。稍后,我会尝试同步文件。
到目前为止,这些是我对如何解决此问题的想法:
- sftp 文件到
/tmp 和本地差异
- 使用
ssh 和diff
- 使用
rsync
我的问题是:系统地比较不同机器(但目录结构相似)中的两个文件的最佳方法是什么,是否有任何内置的 Perl 实用程序可能有用?
【问题讨论】:
标签:
perl
shell
ssh
diff
sftp
【解决方案1】:
如果您需要了解一些本地和远程文件系统的区别,下面的方法可以最大限度地减少网络负载:
-
制作要比较的本地目录 ($D) 的本地副本 ($C)。即:
cp -R $D $C
-
使用 rsync 复制您想要通过 $C 比较的远程目录 ($R):
rsync -av --delete $remote_host:$R $C
-
比较 $D 和 $C:
diff -u $D $C
【解决方案2】:
我曾开发过一个类似的工具(位于python)。它所做的是,在晚上的给定时间运行cron 作业,这会将tar bzipped 文件带到一台服务器,提取目录并在其上运行递归diff。然后,diff 输出通过一些python 脚本运行,这些脚本将分析diff hunks(+ 行/! 行等)以了解更改量。
不确定Perl 或Python 中是否有预构建模块,但其中一个可能肯定有一些帮助工具。
【解决方案3】:
你也可以在这里使用 git。一种可能的工作流程:只需签入您要比较的所有文件(或使用git add -A 完成目录)。然后在您的本地工作站上创建一个空的 git 存储库,用于获取所有其他存储库,并用于进行比较:
git init
git remote add firstmachine ssh://user@firstmachine/path/to/directory
git remote add othermachine ssh://user@othermachine/path/to/directory
git fetch --all
现在可以比较两台机器的内容了:
git diff remotes/firstmachine/master remotes/othermachine/master
或者只是比较特定文件的内容:
git diff remotes/firstmachine/master remotes/othermachine/master -- file/to/compare
没有必要使用第三台机器进行比较。您还可以 git-fetch 内容从 othermachine 到 firstmachine。
【解决方案4】:
rsync 将找出差异并通过仅发送差异来同步您的文件。一旦两个文件夹同步,它将非常快。 (但第一次同步需要一些时间)