使用 rsync 快速显示具有不同内容的文件

使用 rsync 快速显示具有不同内容的文件

我有几个磁盘,里面有大量的文件,这些文件大部分都是相同的。但是,在少数情况下,一个磁盘上的文件与另一个磁盘上的文件不同。还有许多文件在两个驱动器上是相同的,但时间戳不同。

为了我的目的,我需要找到只是实际不同的文件。如果我运行:

rsync --dry-run -HPrlt

它不仅能找到不同的文件,还能找到仅在时间戳上不同的文件,这让我需要做额外的工作来确定这些是否是误报。

我也想尝试一下:

rsync -c --dry-run -HPrlt

但是这个命令需要很多更长。事实上,前一个命令运行了几秒钟(可能是因为目录结构已经在上一个 rsync 的缓存中了),而后一个命令仍在运行。我怀疑这是因为 rsync 依赖于完全根据校验和来确定需要传输哪些文件,而不是使用更智能的方法,例如仅在时间戳不同时才使用校验和。

我如何才能快速查看实际不同的文件?

注意:这不是重复的如何打印使用 rsync 更改的文件? 因为正如对最高评分答案的最高评分评论所指出的那样,--dry-run如果文件的时间戳不同,则会显示相同的文件。

答案1

rsync -HPrl --itemize-changes --dry-run source/ destination/ | grep -Fv "f..T......"| grep -Fv "d..T......"| cut -d " " -f 2

*不要错过源目录的尾部斜杠。

'--itemize-changes' 输出所有更新的变更摘要。当与 --dry-run 结合使用并 grep 出仅需要时间戳更新的文件/目录时,可快速提供所需的输出。

答案2

可以分两个阶段运行 rsync:

  1. 生成大小或时间戳不同的所有文件列表(可能会错误地包含一些相同的文件)
  2. rsync 使用此列表并使用校验和比较选项来查找真正的差异。

这个答案是基于帖子
重复使用 rsync --dry-run 输出来加速稍后的实际传输

要将试运行期间生成的文件列表用作包含文件,需要删除试运行输出顶部和底部的多余的行。

示例输出:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

删除多余的行并仅保留文件列表:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

rsync使用此文件(根据需要添加其他选项):

rsync -c --include-from=include.txt --exclude=* source/ destination/

编辑:我根据发帖人的说法重现了这个问题 要旨 并且可以添加到描述中,只要--dry-run指定,则所有文件都将标记为同步,无论使用哪种参数组合。

我认为问题实际上出在--dry-run,可能是因为它检查了太多元数据属性。看起来像是一个错误。

答案3

这可能是XY问题:您有一个问题需要解决,但询问如何使用 rsync 解决它。

OP 问题询问的是 rsync,但时间戳差异可能始终显示为“不同”。我不确定是否有“-c 但忽略时间戳”选项。无论您决定使用哪种工具,都必须阅读整个文件以验证其内容。

这是一个可能的替代(非 rsync)解决方案:

对树进行哈希处理并找出差异。这将生成一个不同的文件列表。“不同”是指以下任何内容:

  • 内容发生了变化
  • 文件存在于一侧,但是不是另一个
cd /tree1
find -type f -print0 | sort -z | xargs -0 md5sum > /tmp/tree1.log

cd /tree2
find -type f -print0 | sort -z | xargs -0 md5sum > /tmp/tree2.log

diff -uw /tmp/tree1.log /tmp/tree2.log | grep '^[+-]' | awk '{print $2}' | sort -u

(对于 md5sum 反对者:我知道 md5 在找到第二个原像攻击的意义上已被破解……但 OP(可能)并没有寻找加密方面的关键内容,而且 md5 比 sha256 更快。)

相关内容