使用unix比较远程服务器上两个目录的内容

时间:2013-10-16 06:37:14

标签: unix diff ksh rsync vimdiff

我是unix的新手,需要一些帮助。 我在两个不同的服务器上有两个目录。两个目录都包含相同的文件。现在我想检查两个目录中的所有文件是否同步。如果文件不同步,那么我只想显示这些文件的名称。 当目录在同一台服务器上时,我能够做到这一点。当目录存在于两个不同的服务器上时,无法弄清楚如何执行此操作。

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

这里我只希望文件名在不同步时显示。

提前致谢

4 个答案:

答案 0 :(得分:61)

您可以将rsync与-n标志一起使用,以查明文件是否同步,而无需实际执行同步。

例如,来自 server1

rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/

这将打印-rserver1:/abc/home/sample1/

之间不同的所有文件的名称(递归,server2:/abc/home/sample2/标记)
  

rsync使用参数说明

     

-n, --dry-run - 执行试运行而不做任何更改

     

-a, --archive - 存档模式; equals -rlptgoD(no -H,-A,-X)

     

-v, --verbose - 增加详细程度

     

-r, --recursive - 递归目录

     

-c, --checksum - 基于校验和跳过,而非mod-time&大小

答案 1 :(得分:6)

在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准确,因为它使用文件大小而不是内容的哈希值。此外,如果server2有更多文件,那么来自kielni的答案的rsync将不会显示任何内容。相反,试试这个:

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

答案 2 :(得分:0)

在两台服务器之间没有连接的情况下,使用&#34; tree&#34;命令获取文件中的目录结构,然后区分两个文件。

答案 3 :(得分:0)

我始终将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挂载时,这一点尤其有效。