给定原始和备份文件系统,我如何找出是否有任何文件丢失?

给定原始和备份文件系统,我如何找出是否有任何文件丢失?

我发现Stackoverflow 上的这篇文章,如果你只是想获取内容不同的对应文件列表,那么你可以执行:

diff  --brief --recursive dir1/ dir2/

...我自己尝试了一下,结果给出了一个内容不同的文件列表。

但是,如果我备份了原始文件系统(假设是大型文件系统,例如 2TB),并且我想检查备份是否与原始文件系统相同(例如,我想检查备份是否成功),如果我只对两边哪些文件不可用感兴趣,我应该运行什么?我想要一些可以快速检查目录树(而不是检查内容)的东西。

虽然比较文件大小并不能绝对表明备份文件是否不同,但在比较命令期间比较该文件和其他非文件内容元数据会有所帮助。

(我很抱歉重新发布了一个非常相似的问题,但我注意到一位用户认为该问题可能偏离主题,因此这个问题肯定会出现在 stackoverflow 上。)

有这方面的经验吗?

答案1

检查修改时间和文件大小的非 rsync 解决方案:

diff <(find dir1 -mindepth 1 -printf '%P %t %s\n' | sort) <(find dir2 -mindepth 1 -printf '%P %t %s\n' | sort) | grep -E '^[<>]'

示例输出:

> bar Sat Sep 14 11:52:33.0544384394 2013 91
< foo Fri Sep 13 17:58:21.0213671425 2013 445
> foo Sun Sep  8 23:01:02.0355432619 2013 347

表示foo已在 中修改dir1bar仅存在于 中dir2

答案2

您没有告诉我们您使用的是什么备份解决方案,但几乎所有真正的备份程序都具有“验证”模式。(在这种情况下,“真正的”备份工具是 Bacula 之类的软件,它是专门为备份和恢复而设计的软件)。在
其他所有条件相同的情况下,我建议使用真正的备份软件及其内置的验证工具。


rsync -nav --delete <backup> <original>我的建议是,所有其他条件都不一样。
检查内容,并会告诉您有关额外文件、不同文件和丢失文件的信息。它不像 那样深入(缓慢)diff,这-n意味着它实际上不会触及文件系统。

答案3

根据上述答案,我想出了以下想要分享的小脚本:

# vi /bin/checkbackup

#!/bin/bash
echo "1/5: Checking source files..."
find "$1" -type f -printf "%P %s\n" | sort > ~/.checkbackup_files.tmp
echo "2/5: Comparing destination files..."
find "$2" -type f -printf "%P %s\n" | sort | diff - ~/.checkbackup_files.tmp
echo "3/5: Checking source directories..."
find "$1" -type d -printf "%P\n" | sort > ~/.checkbackup_dirs.tmp
echo "4/5: Comparing destination directories..."
find "$2" -type d -printf "%P\n" | sort | diff - ~/.checkbackup_dirs.tmp
echo "5/5: Cleaning up"
rm -f ~/.checkbackup_files.tmp
rm -f ~/.checkbackup_dirs.tmp

# chmod 755 /bin/checkbackup

用法:

$ checkbackup /path/to/dir1 /path/to/dir2

无报告表示文件夹结构和名称相同,文件大小相同、名称相同,没有任何缺失。

在 SATA2 5400rpm 磁盘上的 1.5TB 目录树上进行测试,大约需要 5 分钟完成。

这个脚本还远远没有完成,毫无疑问,还有其他更好、更快、更深入、检查更多的工具。但我还是想分享一下。

相关内容