比较远程服务器上两个目录的内容,使用Unix命令。

41

我是Unix的新手,需要帮助。 我有两个目录存在于两个不同的服务器上。 这两个目录都包含相同的文件。 现在我想检查这两个目录中的所有文件是否同步。 如果文件不同步,那么我只想显示这些文件的名称。 当两个目录在同一台服务器上时,我可以做到这一点,但不知道如何在两个不同服务器上实现。

eg:
server1 /abc/home/sample1/
server2 /abc/home/sample2/

当文件不同步时,我希望只显示文件名。

先行致谢。


将两台服务器安装在共同的系统上,并按照通常的方式进行比较 - devnull
我们不能使用diff、rsync或vimdiff来实现这个吗? - DSD
4个回答

97
你可以使用rsync命令的-n选项来查找文件是否同步,而不实际执行同步操作。
例如,从server1
rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/

使用rsync命令和-r选项,递归比较server1:/abc/home/sample1/server2:/abc/home/sample2/两个目录下的所有文件(包括子目录),并打印出不同的文件名。rsync命令中的其他选项包括:

-n, --dry-run - 模拟运行,不进行实际操作

-a, --archive - 归档模式;等同于-rlptgoD(不包括-H,-A,-X选项)

-v, --verbose - 增加详细输出

-c, --checksum - 基于校验和而非修改时间和文件大小来判断是否跳过文件复制


7
好的回答。这里的“-c”非常重要,因为它特别按照校验和进行比较。没有它,我会得到错误的结果。除非你使用“--files-from”,否则“-a”意味着“-r”。 - blee
5
简而言之,您想要执行命令 rsync -avcn folder1/ folder2/ - mniess
3
文件夹名称末尾的反斜杠非常重要。如果缺少反斜杠,rsync 将会输出所有文件的名称。 - czxttkl
3
我需要查一下,但是有用的提示是 -n 只是 --dry-run 的简写。 - StackEng2010
我们能否按照模式匹配文件名,并将结果与rsync进行比较?例如,./dir1“使用模式比较这些文件”remote:/path/dir2“模式”。 - NiharGht
显示剩余2条评论

10

在server1上:

cd /abc/home/sample1/ && diff --side-by-side --suppress-common-lines <(find . -type f|xargs stat --printf "%s\t%n\n"|sort -n) <(ssh server2 "cd /abc/home/sample2/ && find . -type f|xargs stat --printf \"%s\t%n\n\"|sort -n")

这个方法相当快,但可能比rsync不够准确,因为它使用文件大小而不是内容哈希。 此外,kielni的回答中的rsync如果server2有更多的文件,则不会显示任何东西。 可以尝试使用以下方法:

rsync -n -avr --size-only --delete /abc/home/sample1/ server2:/abc/home/sample2/

你的rsync命令应该被接受为最佳答案,因为它是唯一有效的。 - Jeroen Wiert Pluimers
4
需要使用“--delete”选项来显示文件是否存在于服务器2但不存在于服务器1上,已接受的答案并未显示此信息。 - tsukimi

1
我通常使用rsync -avcn来完成这样的任务-我是一个CLI粉丝。其思想是进行“干跑”(-n),它显示了将要执行的操作,而不会复制任何文件或进行任何更改。使用-c开关非常重要,因为它使用校验和而不是修改日期或文件大小来确定文件是否不同。-a确保比较更彻底,并强制程序进入子目录。最后,-v增加了详细程度,这在发现不同的文件时很有用。
因此,可能的解决方案如下:
rsync -avcn source_dir/ dest_dir/

并且rsync将打印出在两个目录之间不同的文件名。请注意尾随斜杠-它们是必需的。

然而:

  1. 如果有许多不同的文件,则列表很快就会填满终端屏幕,变得难以阅读。在这种情况下,最好将输出重定向到文件:rsync -avcn source_dir/ dest_dir/ > diffs.txt
  2. 这可能听起来很傻,但请记住如果源目录或目标目录中有空格,请转义它们。或者,您可以将它们括在引号内。rsync -avcn /src/My Dir/ dest/My dir/ 不是您想要的;相反,您应该使用 rsync -avcn /src/My\ Dir/ dest/My\ Dir/ 或者 rsync -avcn /src/"My Dir"/ dest/"My Dir"/。在处理Windows挂载时,这一点尤其重要。

-1

如果两台服务器之间没有连接,则可以使用“tree”命令获取文件夹结构,然后比较两个文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接