我正在使用 rsync 同步两个文件夹
rsync -arzv --times --delete-after --relative -e ssh user@host:path/./media/ ~/path/
它说一切都很好,但是目的地报告:
$ du -s path/media/
18335196 site_media/media/
消息来源报道称:
$ du -s path/media/
18473500 site_media/media/
当我深入研究问题时,所有文件的大小都相同,但目录的大小不同。为什么?两者都是运行 ubuntu 的 VM,源在 11.04 上,目标在 12.04 LTS 上
我明白为什么它们加起来不等于相同的数字,我想了解的是为什么文件夹报告的大小不同。
答案1
由于这是两个不同的虚拟机,它们运行着不同的 Ubuntu 主版本,我怀疑文件系统的块大小是罪魁祸首。du
报告正在使用的磁盘大小,而不是文件大小的总和。这是一个微妙但重要的区别。
如果您有一个文件,其大小为 1 字节,并且块大小为 1KB,du
则将报告已使用 1KB。如果块大小为 4KB,则将报告已使用 4KB。如果该文件为 1025B,则对于 1KB 块大小,它将报告已使用 2KB,对于 4KB,它将报告已使用 4KB。如果该文件为 4097B,则对于 1KB 块大小,它将报告已使用 5KB,对于 4KB 块大小,它将报告已使用 8KB。
以下序列演示了此行为:
$ touch foo ; du -h foo
0B foo
$ echo -n 1 > foo ; du -h foo
4.0K foo
使用此命令显示文件系统的块大小:
tune2fs -l /dev/sda1 | grep -i 'block size'
(显然,/dev/sda1
用适当的块设备替换。)
如果不同,那就是你的差异。
检查准确性的更好方法rsync
是对文件进行哈希处理并进行比较。以下是示例:
find path/media -exec openssl sha1 {} + | sort > ~/hashes
然后是diff
文件hashes
。
答案2
使用时存在许多差异来源du
。请查看man
参考。我也在 aix 上遇到过这样的问题。在手册中,有一个选项--apparent-size
,很好地描述了这些差异。另外 - 注意计算大小的块大小(默认值为 1024 字节,但可能因系统而异)。您必须使用显示文件确切大小的命令(或)du
来应对它,这是我用来解决这个问题的方法。ls
find
答案3
另一种可能性是rsync
的--archive
标志默认不保留硬链接。如果您使用硬链接,那么这也可能是您的问题。
答案4
很有可能您已经在目录中添加和删除文件很长时间了。目录中未链接文件的空间会被回收,但将来添加的文件可能无法直接使用这些可用空间。
我假设您还没有镜像曾经发生过的每个文件链接和取消链接 - 源文件链接和取消链接的文件数量很容易比目标文件多十到二十倍 - 因此目标文件不会那么碎片化。
如果您执行一些超级复杂的目录体操,您可能能够减少源目录的大小;它看起来像这样:
mkdir foo
mv media/* foo
rmdir media
mv foo media
请注意,这不会节省足够的驱动器空间,因此不值得这么做。这只是一个有趣的玩具,如果那样的话……