编辑更正和选项的清晰度-我忘记了“-简述”
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应该禁止输出任何文件内容-我很抱歉在早些时候忽略了它-它被半掩埋在一个丑陋的脚本中。