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

如何在 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

理想情况下,我希望有一种方法来进行递归检查,并确认所有内容都匹配。

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

有任何想法吗?

答案1

一个好方法是使用 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

然后只需比较这两个文件(使用 diff)或任何你喜欢的。

这是否符合您所寻找的内容?

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

答案2

如果你不一定关心什么改变了,只是有些东西已经改变,rsync 在这方面仍然很好用。尝试运行此命令并查看输出,假设这是从“servera”运行的。

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

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

答案3

虽然您可以编写一个快速脚本来计算目录中各个文件的 MD5 哈希值,但更好的方法是使用一个名为的工具,md5deep它将递归计算目录中所有文件的哈希值,然后将其输出到一个文件中。然后可以将其用于另一个目录,将第一个哈希文件作为输入,并为您提供两个目录之间不同的文件列表。

因此,以你的例子来说,你可以遵循以下步骤:

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

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

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

  3. 计算服务器 B 上所需目录的哈希值,但使用标志将服务器 A 中的文件哈希值作为输入文件,-x仅显示不同的文件:

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

md5deep 工具集是大多数发行版软件包管理系统的一部分,其优点在于它支持多种不同的哈希算法,而不仅仅是 MD5。因此,如果您担心冲突,则可以使用多种替代方案。以下工具是 md5deep 的一部分,每个工具都提供了一种替代哈希算法:

   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

答案4

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

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

相关内容