【问题标题】:linux - after rsync, du shows size difference when diff does notlinux - 在rsync之后,当diff没有时du显示大小差异
【发布时间】:2020-02-03 16:07:00
【问题描述】:

我使用“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' 还是有区别的。

【问题讨论】:

    标签: linux diff rsync du


    【解决方案1】:

    稀疏文件

    在linux下,你可以创建所谓的sparse files。它们是完整的 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对于安装文件系统来说是小数目,但这只是一个演示。
    • 我认为发生这种情况的原因是操作系统如何处理文件(如 EOF 字符)和稀疏文件的组合。在我的 NTFS 分区中,一些文件是在 windows 下创建的。如果你在 Linux 下创建一个文件,在 Windows 下创建一个文件,在内容相同的情况下,字节数会略有不同。
    • @invinciblecache 不,文件就是文件。创建它们的方法是相同的。 EOF 没关系。如果文件不同,diff 将显示它们!对于 NTFS 稀疏文件,您可以阅读 ntfs.com/ntfs-sparse.htm
    • 按照你的例子,我做了'rsync sparsefile sparsefile2'和'du -k'显示'sparsefile2'就像'normalfile'。但是,如果我执行“cp sparsefile sparsefile3”,“du -k”会显示“sparsefile3”,就像“sparsefile”一样。似乎这完全取决于 rsync 的工作方式,而不依赖于文件系统或操作系统。我认为最好将此观察结果添加到您的答案中。
    • 命令rsynccp 都有选项--sparse!请参阅手册页!
    【解决方案2】:

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

    同时检查可能未包含在您的du 中的隐藏文件。

    【讨论】:

    • 我也试过'du -s --apparent-size',它显示出不同。我发现这是因为文件稀疏。
    【解决方案3】:

    问候无敌缓存,

    四处搜索我发现了这个:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 2017-04-27
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2023-01-26
      相关资源
      最近更新 更多