我发现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
已在 中修改dir1
且bar
仅存在于 中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 分钟完成。
这个脚本还远远没有完成,毫无疑问,还有其他更好、更快、更深入、检查更多的工具。但我还是想分享一下。