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
......其中一个能完成这项工作吗?)
编辑以进行更正和选项清晰度 - 我忘记了“--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 应该抑制任何文件内容输出 - 我很抱歉之前忽略了它 - 它被半埋在一个丑陋的脚本中。
这是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。这会快很多。
更多细节:
| 归档时间: |
|
| 查看次数: |
16381 次 |
| 最近记录: |