Linux - rsync 后,du 显示大小差异,但 diff 没有显示差异

3

我使用 “rsync” 将一个大文件夹从 NTFS 复制到 ext4,并使用 “diff” 进行了验证。出于好奇,我还使用了 “du” 命令来检查文件夹是否具有相同的大小。虽然 “diff” 没有显示任何差异,但 “du” 显示文件夹的大小不同。在执行以下命令时,我没有遇到任何错误。

rsync --archive --recursive "$src" "$dest" 2>rsync_error.txt

sync

diff --brief --recursive --new-file "$src" "$dest" 1>diff-log.txt 2>diff-error.txt

然后我对每个文件夹使用了"du"命令:
du -sb "$src"
du -sb "$dest"
Output:
137197597476
137203512004

1.既然没有任何区别,为什么会发生这种情况?

2.我应该担心我的数据还是我的系统?

编辑:我也尝试了du -s --apparent-size,但仍然存在差异。


你的文件系统是什么?(两边都一样吗?) - undefined
3个回答

1

你好,Invinciblecache:

我在Google上找到了以下内容:

由于du报告的是分配空间而不是绝对文件空间,因此如果删除了文件但其块尚未释放,则du显示的文件系统上的空间量可能与df显示的不同。 source

这不是最好的来源,但是它很好地描述了du的用途。

因此,我会依赖diff来检查文件内容,但我建议忽略文件系统上的大小差异,除非它太高,这不是当前情况。


1

稀疏文件

在Linux下,你可以创建所谓的稀疏文件。它们是一种文件,其中完整的NULL块并不存在!

试试这个:

$ dd if=/dev/zero count=2048 of=normalfile
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0103269 s, 102 MB/s

并且

$ dd if=/dev/zero count=0 seek=2048 of=sparsefile
0+0 records in
0+0 records out
0 bytes copied, 0.000182708 s, 0.0 kB/s

那么

$ ls -l sparsefile normalfile
-rw-r--r-- 1 user  user  1048576 Feb  3 17:53 normalfile
-rw-r--r-- 1 user  user  1048576 Feb  3 17:53 sparsefile

$ du -b sparsefile normalfile
1048576     sparsefile
1048576     normalfile

但是
$ du -k sparsefile normalfile
0   sparsefile
1024        normalfile

$ du -h sparsefile normalfile
0   sparsefile
1.0M        normalfile

如果在 sparsefile 中没有使用长块,则它们将不会被分配!

$ du -k --apparent-size sparsefile normalfile
1024        sparsefile
1024        normalfile

那么

$ diff sparsefile normalfile
echo $?
0

这两个文件几乎没有区别!

进一步的

$ /sbin/mkfs.ext4 sparsefile 
mke2fs 1.44.5 (15-Dec-2018)
Filesystem too small for a journal
...
Writing superblocks and filesystem accounting information: done

$ ls -l sparsefile normalfile 
-rw-r--r-- 1 user  user  1048576 Feb  3 17:53 normalfile
-rw-r--r-- 1 user  user  1048576 Feb  3 17:59 sparsefile

$ du -k sparsefile 
32  sparsefile

$ diff sparsefile normalfile
Binary files sparsefile and normalfile differ

当然,对于安装文件系统来说,1Mb只是一个很小的容量,但这仅仅是为了演示而已。 - undefined
我认为这种情况发生的原因是操作系统处理文件(如EOF字符)和稀疏文件的结合。在我的NTFS分区中,有些文件是在Windows下创建的。如果你在Linux下创建一个文件,然后再在Windows下创建同样的文件,字节会有轻微的差异,但内容是相同的。 - undefined
@invinciblecache 不,文件就是文件。创建它们的方式是相同的。*EOF* 在这里并不重要。如果文件不同,diff 命令会显示出来!关于 NTFS 稀疏文件,你可以阅读 http://www.ntfs.com/ntfs-sparse.htm - undefined
根据你的示例,我执行了'rsync sparsefile sparsefile2'和'du -k'显示'sparsefile2'像'normalfile'一样。然而,如果我执行'cp sparsefile sparsefile3','du -k'显示'sparsefile3'像'sparsefile'一样。这似乎完全取决于rsync的工作方式,而不是文件系统或操作系统。我认为将这个观察结果添加到你的答案中会很好。 - undefined
rsynccp这两个命令都有--sparse选项!请查看man手册! - undefined

0

du报告的是包括文件系统空间在内的空间,而不仅仅是文件内容大小。

还要检查隐藏文件,这些文件可能不会被包括在你的du中。


我还尝试了使用 'du -s --apparent-size' 命令,结果显示有差异。我发现这是由于稀疏文件造成的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接