将大量目录与进度报告进行比较

Dan*_*Dan 14 diff rsync progress-information

我只是将 2,000,000 个文件 (3TB) 从一个 RAID 同步到另一个。

我想确保我的数据完好无损。

rsync -c 需要很长时间。

diff 没有告诉我它在做什么。

是否有替代方案(a)更快,并且(b)会在比较时向我展示进度?

(我在 Mac 上,并brew search diff给了我apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ......其中一个能完成这项工作吗?)

D M*_*eon 7

编辑以进行更正和选项清晰度 - 我忘记了“--brief”

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes
Run Code Online (Sandbox Code Playgroud)

并根据您要比较的内容添加其他选项来品尝:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names
Run Code Online (Sandbox Code Playgroud)

diff -rs 将读取原始和副本的每个字节,并报告相同的文件。

diff 输出格式是由 POSIX 定义的,所以它非常便携。您可能想要添加以下内容:

| tee diff-out.1 | grep -v -Ee '文件 .* 和 .* 是相同的'

您可以使用 chksums 或哈希,但随后您必须使它们与文件树同步,因此无论如何您将返回读取每个文件的每个字节。

编辑 - 评论太长了,回应:

超过 10GB 的文件未验证

你可能想试试这个 diff 选项:--speed-large-files

您使用的差异可能无法很好地处理非常大的文件(例如,大于系统内存),因此报告了实际上相同的文件之间的差异。

我原以为有一个 -h 选项或一个 'bdiff' 可以在大文件上做得更好,但我在 Fedora 中找不到。我相信 --speed-large-files 选项是“-h”“半心半意比较”选项的继承者。

另一种方法是使用“-vin”(详细、逐项、no_run)重复您使用的 rsync 命令。这将报告 rsync 发现的任何差异 - 不应该有任何差异。

要移动某些文件,您需要查看类似以下内容的脚本:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi
Run Code Online (Sandbox Code Playgroud)

但我不建议这样做。潜在的问题是“我如何确定 rsync 正确复制了文件层次结构?” 如果您可以使用 diff 或其他工具向自己证明 rsync 运行良好,那么您可以只依赖 rsync,而不是绕过它。

rsync -vin 将根据您提供的任何其他选项进行比较。我认为它默认为校验和,但你是对的, -c 或 --checksum 是必需的。

diff 实用程序实际上是用于文本行文件,但对于二进制文件,它应该在 -s 下报告“相同”。

--brief 应该抑制任何文件内容输出 - 我很抱歉之前忽略了它 - 它被半埋在一个丑陋的脚本中。


les*_*ana 5

这是diff基于文件计数的进度报告:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile
Run Code Online (Sandbox Code Playgroud)

您将需要 pv(管道查看器):http : //www.ivarch.com/programs/pv.shtml

解释:

  • diff -r 递归比较目录和子目录。
  • diff -q仅打印文件的文件名不同。不打印实际差异。
  • diff -s还打印没有不同的文件的文件名。这对于进度信息很重要。
  • pv -l 根据行数报告进度。
  • pv -s count 根据计数估计完成时间。
  • 重定向到logfile是为了漂亮的输出。否则输出 fromdiff将与来自 的状态行混合pv

要获取文件计数,请使用以下命令:

find dir1 -type f | wc -l
Run Code Online (Sandbox Code Playgroud)

过滤日志文件以查找不同的文件:

grep -v "^Files .* identical$" logfile
Run Code Online (Sandbox Code Playgroud)

此变体将实时打印不同的文件,同时还记录所有内容logfile

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"
Run Code Online (Sandbox Code Playgroud)

或者,您可以仅记录不同的文件:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile
Run Code Online (Sandbox Code Playgroud)

注意:上述命令将根据文件计数报告进度。如果有很多小文件,这效果最好。如果您有几个大文件,那么您将不会有太多乐趣。

遗憾的是,我不知道有一种简单的方法可以根据比较的字节来报告进度。


如果您可以通过比较元数据(而不是文件的实际内容)找到自己的平静,那么您可以使用 rsync。这会快很多。

更多细节:


小智 0

我会考虑使用某种哈希应用程序来检查数据完整性。我知道许多重复文件查找实用程序使用哈希来识别重复/非重复。在我看来,这是一项可能值得的调查。