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

DSD*_*DSD 25 unix diff rsync ksh vimdiff

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

eg:
server1 /abc/home/sample1/
server2 /abc/home/sample2/
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

kie*_*lni 65

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

例如,从server1:

rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/
Run Code Online (Sandbox Code Playgroud)

这将打印-rserver1:/abc/home/sample1/和之间不同的所有文件的名称(递归,带有标志)server2:/abc/home/sample2/

rsync 使用参数说明

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

-a, --archive - 存档模式; 等于-rlptgoD(无-H,-A,-X)

-v, --verbose - 增加冗长度

-r, --recursive - 递归目录

-c, --checksum- 基于校验和跳过,而不是模态时间和大小

  • 总结一下.你想要`rsync -avcn folder1/folder2 /`. (4认同)
  • 很好的答案.这里的`-c`非常重要,因为它通过校验和进行比较.没有它,我得到了误报.`-a`暗示`-r`(除非你使用`--files-from`) (3认同)
  • 文件夹名称末尾的反斜杠非常重要。缺少反斜杠将导致 rsync 打印所有文件的名称。 (3认同)
  • 我不得不这样看,但是注意`-n`只是`--dry-run`的简写是有用的. (3认同)

AXE*_*abs 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")
Run Code Online (Sandbox Code Playgroud)

这非常快,但可能不如rsync准确,因为它使用文件大小而不是内容的哈希.此外,如果server2有更多的文件,那么来自kielni的答案的rsync将不显示任何内容.而是试试这个:

rsync -n -avr --size-only --delete /abc/home/sample1/ server2:/abc/home/sample2/
Run Code Online (Sandbox Code Playgroud)

  • --delete 需要显示文件是否存在于服务器 2 而不是服务器 1,接受的答案没有显示 (2认同)