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


13

我只是将2,000,000个文件(3TB)从一个RAID同步到另一个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 ...其中一个可以胜任吗?)



对于为什么rsync以大约150MB / s的速度复制数据,而diff仅以60MB / s的速度进行复制,我也感到困惑。
2014年

1
默认情况下,使用副本rsync速度更快的b / c rsync不使用校验和来比较文件,而是查看大小和日期信息。使用rsync -c所有文件时,需要计算其校验和,这是一项繁重的任务,因此为什么不是默认文件。
slm

是的,但是diff不复制...它只读取两个文件;而要复制的rsync,必须先读取每个字节,然后再写入。这是从头开始的rsync,因此它正在复制每个文件。
2014年

Answers:


6

编辑更正和选项的清晰度-我忘记了“-简述”

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

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

-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

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

diff输出格式由POSIX定义,因此可移植性很强。您可能需要添加类似以下内容:

| 三通diff-out.1 | grep -v -Ee'文件。*和。*相同'

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

编辑-太长而无法发表评论,以回应:

超过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

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

rsync -vin将根据您提供的其他选项进行比较。我以为它默认为校验和,但是您是正确的,为此需要-c或--checksum。

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

--brief应该禁止输出任何文件内容-我很抱歉在早些时候忽略了它-它被半掩埋在一个丑陋的脚本中。


有没有一种方法可以将其mv保存到驱动器根目录下“已验证”文件夹中的每个文件中,并保留完整路径?例如,如果/disk1/a/b/c/file1与相同/disk2/a/b/c/file1,则将其移至/disk1/verified/a/b/c/file1。然后,我只能得到复制不良的文件。(到目前为止,超过10GB的文件数量尚未验证,这很可怕。)

您可能需要尝试以下选项:--speed-large-files
D McKeon 2014年

那到底是做什么的?
2014年

如果我运行rsync -vin-是否按字节比较或校验和比较?我认为rsync仅比较大小/日期,除非您添加-c。从我所读的内容来看,speed large files似乎只对非二进制文件有所作为...还是我错了?
2014年

diff给我以"Files __ and ___ differ"... 形式的结果,并且我一直sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"在尝试通过尝试生成用于重新复制错误文件的脚本。但是diff的输出未引用,因此不起作用。我可以得到引用路径吗?
2014年

4

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

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

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

说明:

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

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

find dir1 -type f | wc -l

筛选日志文件中不同的文件:

grep -v "^Files .* identical$" logfile

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

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

或者,您只能记录不同的文件:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

注意:以上命令将根据文件数报告进度。如果有很多小文件,这将是最好的选择。如果您有一些大文件,那么您将不会有太多的乐趣。

可悲的是,我不知道一种基于比较字节报告进度的简单方法。


如果仅通过比较元数据(而不是文件的实际内容)就可以安心使用,则可以使用rsync。这将大大加快。

更多细节:


0

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


0

您可以为此使用rdiff-backup。将其安装在两台服务器上,它将对校验和进行智能比较,并同步还不存在的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.