比较远程主机上的多个目录

compare multiple directories on remote hosts

有没有办法区分多个目录而不是两个目录的内容?或者在多个主机上区分单个目录。 我编写了以下 bash 脚本来区分三个主机上的目录

#!/bin/bash

if [[ -n "$(diff <(ssh user@host1 ls -r /user/test1) <(ssh user@host2 ls -r /user/test1))" || -n "$(diff <(ssh user@host2 ls -r /user/test1) <(ssh user@host3 ls -r /user/test1))" ]]; then
  echo "There are differences"
fi

有更好的方法吗?

您可以对每个主机的文件列表使用 MD5 校验和。它将允许您对不同数量的服务器使用相同的脚本。如果列表相同,您应该收到相同的校验和值。然后你只需将所有的总和与前一个进行比较。如果它与任何其他校验和不同,则说明存在差异。

#!/bin/bash

MD5SUMS=$(
for hostname in host{1,2,3}
do
    result=$(ssh user@${hostname} ls -r /user/test1 | md5sum)
    result=${result%% *}
done
)

PREVSUM=""
for SUM in ${MD5SUMS}
do
    if [ -z "$PREVSUM" ]
    then
        PREVSUM=$SUM
        continue
    else
        if [ "$PREVSUM" != "$SUM" ]
        then
            echo "There are differences"
        fi
        PREVSUM=$SUM
    fi
done

是的,GNU diff 有一个选项 --from-file 允许将一个参考文件或目录与许多其他参考文件或目录进行比较。

diff -r --from-file=ref-dir dir1 dir2 ... dirN

请注意,它只会将 ref-dirdir1、...、dirN 进行比较;它不会比较 dir1dir2, ..., dirN.

至于您的远程目录,因为您可以通过 ssh 访问机器,您可以使用 sshfs 在本地安装它们以便在它们上执行 diff