如何在Linux中轻松确认两个独立的目录具有完全相同的内容?

CentOS 5.x

Mq的问题似乎与这一个类似,但我不知道…

我有两个服务器(完全隔离),每个都有一个目录和子目录应该有相同的确切内容。

例如,目录布局可能是这样的:

服务器A –

/opt/foo/foob/1092380298309128301283/123.txt /opt/foo/foob/5094380298309128301283/456.txt /opt/foo/foob/5092380298309128301283/789.txt /opt/foo/foob/1592380298309128301283/abc.txt 

服务器B –

 /opt/foo/foob/1092380298309128301283/123.txt /opt/foo/foob/5094380298309128301283/456.txt /opt/foo/foob/5092380298309128301283/789.txt /opt/foo/foob/1592380298309128301283/abc.txt 

理想情况下,我想要一个方法来做recursion检查,并确认一切都匹配。

我也想避免使用任何第三方工具。

有任何想法吗?

一个好方法是在树中的每个文件上使用md5sums:

在server1上运行这个:

 find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx 

在server2上运行这个

 find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx 

然后只是比较两个文件(使用差异)或任何你喜欢的。

那就是你要找的东西吗?

当然,如果你愿意,你可以使用SSH远程执行命令。

如果你不一定关心什么改变了,只是改变了一些东西,rsync还是非常好的。 尝试运行这个命令,并在输出端采取一个偏差,假设这是从“servera”运行的。

 rsync -avcn /opt/foo/ serverb:/opt/foo 

结果列表将是那些如果你真的运行同步过程将被修改的文件。 请记住,即使只更改时间戳,文件也会显示在列表中,但内容保持不变。 由于我们添加了-n标志,因此不会执行任何操作,只会报告。

虽然可以将一个快速脚本一起使用,该脚本将为目录中的单个文件计算各个MD5散列值,但更好的方法是使用名为md5deep的工具,该工具将以recursion方式计算目录中所有文件的散列值,然后输出到一个文件。 然后可以在另一个目录上使用它,将第一个散列文件作为input,并为您提供两个目录之间不同的文件列表。

所以,举个例子,你可以按照这个过程:

  1. 计算服务器A上所需目录的散列值:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. 将文件file_hashes.txt文件复制到服务器B上进行比较。

  3. 计算服务器B上所需目录的散列值,但是将服务器A的文件散列值作为input文件,使用-x标志只显示不同的文件:

    md5deep -x file_hashes.txt -r /opt/foo/

md5deep工具集构成了大部分发行版的包pipe理系统的一部分,最重要的是它支持多种不同的哈希algorithm,而不仅仅是MD5。 所以如果你对于碰撞有偏见,你可以select一些替代品。 以下工具构成了md5deep的一部分,每个工具都提供了一种替代哈希algorithm:

  md5deep - Compute and compare MD5 message digests sha1deep - Compute and compare SHA-1 message digests sha256deep - Compute and compare SHA-256 message digests tigerdeep - Compute and compare Tiger message digests whirlpooldeep - Compute and compare Whirlpool message digests 

我使用了类似于@斯科特包的技术这将告诉你双向差异。 所有以“删除”开头的文件都是远程服务器上的文件,而不是本地服务器上的文件。 没有任何文件内容的每个目录都是没有变化的。 列出的每个文件都是远程服务器上不存在的文件,或者是本地版本为“较新”的文件。

 rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/