【问题标题】:compare contents of two directories on remote server using unix使用 unix 比较远程服务器上两个目录的内容
【发布时间】:2013-10-24 04:07:50
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

  • 将两台服务器安装在一个公共系统上,然后照常比较你的做法
  • 我们不能使用 diff、rsync 或 vimdiff 来实现吗

标签: unix diff ksh rsync vimdiff


【解决方案1】:

您可以使用带有-n 标志的rsync 来确定文件是否同步,而无需实际进行同步。

例如,来自 server1

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

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

rsync使用参数说明

-n, --dry-run - 在不做任何更改的情况下进行试运行

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

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

-r, --recursive - 递归到目录

-c, --checksum - 根据校验和跳过,而不是 mod-time & size

【讨论】:

  • 很好的答案。这里的-c 非常重要,因为它专门通过校验和进行比较。没有它,我会得到误报。 -a 暗示 -r(除非你使用的是 --files-from
  • 只是总结一下。你想要rsync -avcn folder1/ folder2/
  • 文件夹名称末尾的反斜杠非常重要。缺少反斜杠会导致 rsync 打印所有文件的名称。
  • 我必须查一下,但请注意-n 只是--dry-run 的简写
  • 使用的 rsync 标志摘要:-n 试运行(实际上不传输任何文件,非常重要) - -a 存档模式(保留符号链接、权限、时间戳...) - -v 详细输出 - -r 递归 - -c 使用校验和而不是时间戳+文件大小进行比较。这对于避免误报很重要,因为这两个位置可能没有匹配的时间戳。
【解决方案2】:

在服务器 1 上:

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 的文件比 server1 多,则 kielni 的答案中的 rsync 不会显示任何内容。试试这个:

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

【讨论】:

  • 您的 rsync 命令应该是公认的答案,因为它是唯一有效的。
  • --delete 需要显示服务器 2 上是否存在文件但服务器 1 上是否存在文件,接受的答案不显示
【解决方案3】:

对于此类任务,我总是使用rsync -avcn - 我是 CLI 粉丝。这个想法是做一个“试运行”(-n),它显示了在没有实际复制任何文件或进行任何更改的情况下会做什么。使用-c 开关非常重要,因为它使用校验和而不是修改日期或文件大小来确定文件是否不同。 -a 确保比较更彻底,并强制程序深入到子目录中。最后,-v 增加了详细程度,这在发现不同文件时很有用。

所以一个可能的解决方案是这样的:

rsync -avcn source_dir/ dest_dir/

rsync 将打印两个目录之间不同的文件名。注意尾部的斜线 - 它们是必不可少的。

但是:

  1. 如果有许多不同的文件,列表很快就会填满终端屏幕并且变得难以阅读。在这种情况下,最好将输出重定向到一个文件:rsync -avcn source_dir/ dest_dir/ &gt; 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 挂载时尤其有效。

【讨论】:

    【解决方案4】:

    在两台服务器之间没有连接的情况下,使用“tree”命令获取文件中的目录结构,然后比较两个文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多