如何比较两个不同服务器上的两个目录

我有一个要求就像…我需要编写一个shell脚本,它将比较两个不同服务器(服务器A和服务器B)中的两个目录,并列出不一致的地方。 理想情况下,两个服务器中的文件名,计数,大小应该相同。 所以脚本应该找出差异。 任何人都可以帮我吗? 感谢提前和最好的问候,Prasenjit

我喜欢为此使用rsync。

例如,在ServerA上运行:

rsync -avnc --delete /path/to/dir/ serverB:/path/to/dir/ 

如果不需要对文件进行校验和比较,则可以删除-c开关。 没有它,rsync会假设他们是相同的,如果他们有相同的大小和时间戳。

请注意每个path后面的斜杠。

非常重要:确保你有-n开关,否则rsync将开始改变ServerB的内容

在Linux上做一个简单的方法是:

  1. 使用findls列出每个目录中的所有文件,并将结果传送到不同的日志文件中。 使用ls会更好,因为它可以显示各种信息,包括权限,date和大小。
  2. 比较使用diff类的日志文件来识别任何差异。

希望这可以帮助你开始。

find可以让你更好地控制你正在比较的东西,只允许你打印你需要的信息。 例如,如果您想根据文件的名称和大小比较文件,而不是date或所有者/群组信息,则可以执行以下操作:

 find . -printf "%p\t%s\n" 

find支持多种types的文件信息。 这只是一些:

 %g File's group name, or numeric group ID if the group has no name. %G File's numeric group ID. %m File's permission bits (in octal). %M File's permissions (in symbolic form, as for ls). %n Number of hard links to file. %t File's last modification time in the format returned by the C 'ctime' function. 

也许最简单的是,如果你可以用这样的方法安装这两个目录,你可以这样做:

 diff <(cd dir1; find . -printf "%p\t%s\n"|sort) <(cd dir2; find . -printf "%p\t%s\n"|sort) 

我build议树:

 ssh ServerA "tree -s -f <directory>" > /tmp/out1 && ssh ServerB "tree -s -f <directory>" > /tmp/out2 && diff /tmp/out1 /tmp/out2