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


8

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

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

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

有任何想法吗?


您是否只是想比较两个目录,或者实际上是将其中一个复制为另一个?
Scott Pack

@ScottPack很好的问题。我想比较但不做任何更改。其他问题正在处理目录的复制。我只想确保它正在执行任务。
Mike B

1
您已经标记了这个问题rsync?所以...嗯,使用rsync(带-n选项)?
骗子2012年

@faker我认为可以使用rsync,但不确定是否有针对此用例的更好,更轻松或更特定的东西。我需要知道文件名,日期,大小和相对位置是否匹配。
Mike B

请注意,如果时间和大小匹配,rsync不会检查文件内容,如果这让您担心,请参阅--checksum选项

Answers:


9

一种好的方法是在树中的每个文件上使用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远程执行命令。


谢谢卡姆登。是的,我想这就是我想要的。我将对其进行测试,看看是否可行。
Mike B

2
或md5sum md5sums
dmourati

太好了-是的,如果您不希望知道哪些文件发生了更改,则只需md5sum生成的文件并比较这两个总和即可。
卡姆登S.

另外,您可能已经知道了这一点,但是只要通过SSH远程执行该命令,就可以了ssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.

1
MikeB,通过执行递归长列表并将其传递给md5sum,您将获得目录列表的md5sum,该列表将排除文件的内容。如果两端文件系统上的inode大小不同,那么很可能也会在文件大小上造成差异。对内容进行md5sum,就像@CamdenS最初建议的那样。更好。
nearora

7

如果您不必在乎发生了什么变化,而只是在乎某些变化,那么rsync仍然真的很适合。尝试运行此命令,并在输出中使用gander,假设这是从“ servera”运行的。

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

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


谢谢。如果两个盒子彼此完全隔离怎么办?如何使用输出进行比较?
Mike B

rsync不支持将源和目标都设置为远程,因此他需要在其中一台服务器上运行它
伪造者

@faker:必须承认,以前从未尝试过,很高兴知道。正如您所说,这很容易解释。
Scott Pack

+1。巧妙使用rsync。但是,要完全正确,您需要rsync在两个方向上运行。也就是说,您需要添加以下内容:rsync -avcn serverb:/opt/foo/ /opt/foo
史蒂文·

5

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

因此,以您的示例为例,您将遵循以下过程:

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

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

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

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

    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

0

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

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.