我刚刚将目录树复制到另一个带有cp -a
.这棵树大约有 70GB 大,有数百万个文件,而 diff 需要很长时间才能完成,所以我正在寻找其他方法来比较目录。
首先,我在两个目录上启动 find,结果是相同的。
在我启动 du -h 后,一个目录给出了 72GB,另一个目录给出了 75GB。假设复制过程顺利的话,什么会导致这种差异?磁盘块大小相同,4096。一个分区是EXT3,另一个分区是EXT4,可能是这样吗?
答案1
是的,它们将具有不同的磁盘使用情况,具体取决于 EXT4 的调整方式,它可能具有 256 或 128 字节 inode,目录的分配可能不同,并且小文件可能占用不同的空间量。不过 3GB 听起来确实很多。
我个人首选的比较文件系统的方法是:
( cd /src/dir; find . -type f -print0 | xargs =0 cksum ) | sort >/tmp/src.cksum ( cd /dst/dir; find . -type f -print0 | xargs -0 cksum ) | sort >/tmp/dst.cksum cksum /tmp/*.cksum
如果两个文件层次结构的文件名和校验和的校验和相同,我感到很有信心。比这更快,diff
因为没有比较,只是对所有内容进行直接哈希处理。
ssh
上述方法的优点是它也可以通过不同的机器轻松完成。
答案2
大概cp -a
做了一些疏复制文件时的魔法——或者未能执行该魔法;你没说原件和复制品哪个大?
这就是联机帮助页所说的cp
:
默认情况下,通过粗略启发式检测稀疏源文件,并且相应的目标文件也变得稀疏。这是 --sparse=auto 选择的行为。
du -S
要比较目录并获取哪些文件实际上具有不同的大小,您可以尝试比较两者的输出:
diff <(cd orig; du -S . | sort -n) <(cd copy; du -S . | sort -n)