rsync 比较目录?

rsync 比较目录?

是否可以使用 rsync 比较两个目录并仅打印差异?有一个试运行选项,但是当我将详细程度增加到一定程度时,会显示每个比较的文件。

ls -alR这里没有diff选项,因为源代码中存在硬链接,使得每一行都不同。 (当然,我可以用 perl 删除这一列。)

答案1

添加到尼尔斯的答案(对于通过谷歌遇到这个问题的任何人),默认情况下rsync仅比较文件大小和修改时间来判断是否存在任何差异。 (如果它们不同,它会执行更多操作,但如果它们相同,它会停在那里。)

如果你想比较实际文件内容,即使对于具有相同大小和上次修改时间的文件,也添加标志-c来告诉rsync使用校验和来比较文件。

rsync -avnc $SOURCE $TARGET

(该-u选项告诉 rsync 忽略$TARGET比 on更新的文件$SOURCE,如果您要比较内容,您可能不希望这样做。)

答案2

rsync -avun --delete您可能必须在两个方向上运行类似的操作 。

但你实际上想要实现什么目标?

更新:

rsync -avun --delete $TARGET $SOURCE |grep "^deleting " 将为您提供目标目录中不存在的文件列表。

“grep delet”因为每行打印:删除ing ..文件..

rsync -avun $SOURCE $TARGET将为您提供“不同”文件(包括新文件)的列表。

答案3

仅供那些不太熟悉的人使用rsync

rsync -rvnc --delete ${SOURCE}/ ${DEST}
  • -r:递归到目录;
  • -v:列出文件)
  • -n:最重要的一点——做不是改变任何事情;
  • -c:通过校验和而不是 mod-time & size 比较内容(-a否则使用);
  • --delete:寻找对称的差异,而不是单向的差异。
  • 最后,/意味着“查看目录内部,并比较其内容到目的地”。

它将打印通常的rsync输出,

  • 与一个<文件名>在每个“新”文件的一行上${SOURCE}
  • 和一个“删除<文件名>”中每个“新”文件的行${DEST}
  • 它还可能打印一些警告,例如“跳过非常规文件<文件名>”对于符号链接。

附言。我知道这是一个糟糕的 PS——但它确实是匆忙添加的。尽管如此,我打赌人们可能会发现这很有用。


聚苯硫醚。或者,也可以这样做
find $SOURCE -type f -exec md5sum {} \; | tee source.md5
find $DEST   -type f -exec md5sum {} \; | tee dest.md5

如果文件名不包含换行符,我们就可以对这两个*.md5文件及其diff本身进行排序。 (不过,这仅适用于文件;也就是说,不会检测到两侧的空目录。)

答案4

我从你的问题中了解到你不想使用 diff上 LS,但您也可以在目录上递归地使用 diff:

diff -rq DIR1 DIR2

相关内容