我有几个磁盘,里面有大量的文件,这些文件大部分都是相同的。但是,在少数情况下,一个磁盘上的文件与另一个磁盘上的文件不同。还有许多文件在两个驱动器上是相同的,但时间戳不同。
为了我的目的,我需要找到只是实际不同的文件。如果我运行:
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:
- 生成大小或时间戳不同的所有文件列表(可能会错误地包含一些相同的文件)
- 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 更快。)