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

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

我有一个需求,比如...我需要编写一个 shell 脚本,它将比较位于两个不同服务器(服务器 A 和服务器 B)中的两个目录,并列出发现的差异(如果发现)。理想情况下,两个服务器中的目录的文件名、计数、大小应该相同。因此,脚本应该找出差异(如果有)。有人能帮我吗?提前致谢,并致以最诚挚的问候,Prasenjit

答案1

我喜欢使用 rsync 来实现这个目的。

例如在 ServerA 上运行:

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

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

请注意每条路径末尾的斜杠。

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

答案2

在 Linux 上执行此操作的一个简单方法是:

  1. 使用findls列出每个目录中的所有文件,并将结果导入不同的日志文件。使用ls更适合您的目的,因为它可以显示各种信息,包括权限、日期和大小。
  2. 使用类似的方法比较日志文件diff来识别任何差异。

希望这可以帮助您入门。

答案3

find可以让你更好地控制比较的内容,因为你只打印你需要的信息。例如,如果你想根据文件的名称和大小来比较文件,而不是根据文件日期或所有者/组信息来比较文件,你可以这样做:

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

find支持多种类型的文件信息。以下仅列举几种:

%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)

答案4

我建议树:

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

相关内容