为什么du的输出经常如此不同于du -b?-b是--apparent-size --block-size=1的简写.只使用--apparent-size给我相同的结果大部分时间,但是--block-size=1似乎做这把戏.我想知道如果输出然后是正确的偶数,并且哪些数字是我想要的?(即实际的文件大小,如果拷贝到另一个存储设备)
du
du -b
-b
--apparent-size --block-size=1
--apparent-size
--block-size=1
tv6aics11#
cat theFile | wc -c
mmap
在大多数情况下,表观大小小于磁盘使用量,因为磁盘使用量计算最后一个磁盘的完整大小(部分)块,表观大小仅计算最后一个块中的数据。但是,当您有稀疏文件时,表观大小会更大(稀疏文件是在您查找文件末尾之后的某个位置时创建的,然后在那里写一些东西--操作系统不需要创建很多用零填充的块--它只为您决定写入的文件部分创建一个块)。
wwodge7n2#
让我们玩一小会儿,看看是怎么回事。mount告诉我我在/上挂载的ext4分区上。I find its block size与:
mount
/
stat -fc %s .
其给出:
4096
现在让我们创建一些大小为1 4095 4096 4097的文件,并使用--block-size=1(-b的同义词)进行测试:
1 4095 4096 4097
#!/usr/bin/env bash for size in 1 4095 4096 4097; do dd if=/dev/zero of=f bs=1 count="${size}" status=none echo "size ${size}" echo "real $(du --block-size=1 f)" echo "apparent $(du --block-size=1 --apparent-size f)" echo done
其结果是:
size 1 real 4096 f apparent 1 f size 4095 real 4096 f apparent 4095 f size 4096 real 4096 f apparent 4096 f size 4097 real 8192 f apparent 4097 f
因此,我们可以看到,任何小于或等于4096的值实际上都占用4096字节。然后,一旦我们穿过4097,它就上升到8192,也就是2 * 4096。显然,磁盘总是在4096字节的块边界存储数据。
4097
8192
2 * 4096
我还没有研究确切的表示是什么,但很明显--apparent确实考虑到了这一点。这可能导致表观大小大于实际磁盘使用量。例如:
--apparent
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none du --block-size=1 f du --block-size=1 --apparent f
给出:
8192 f 1073741825 f
相关:How to test if sparse file is supported
一些可能性包括:
参考书目:
在Ubuntu 16.04中测试。
vnjpjtjt3#
比较(例如)du -bm与du -m。-b设置--apparent-size --block-size=1,但m将块大小覆盖为1M。-bh与-h相似:-bh意味着--apparent-size --block-size=1 --human-readable,并且h再次覆盖该块大小。
du -bm
du -m
m
1M
-bh
-h
--apparent-size --block-size=1 --human-readable
h
wydwbb8l4#
文件和文件夹有其真实的大小和磁盘上的大小。
如果你发现表观大小几乎总是比磁盘使用量高出几个数量级,那么这意味着你有很多('稀疏')文件或文件具有内部碎片或间接块。
jslywgbw5#
因为默认情况下du给出了磁盘使用量,它等于或大于文件大小。
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in (`sparse') files, internal fragmentation, indirect blocks, and the like
5条答案
按热度按时间tv6aics11#
cat theFile | wc -c
的结果,以及如果您使用mmap
加载整个文件,文件将占用的地址空间量。在大多数情况下,表观大小小于磁盘使用量,因为磁盘使用量计算最后一个磁盘的完整大小(部分)块,表观大小仅计算最后一个块中的数据。但是,当您有稀疏文件时,表观大小会更大(稀疏文件是在您查找文件末尾之后的某个位置时创建的,然后在那里写一些东西--操作系统不需要创建很多用零填充的块--它只为您决定写入的文件部分创建一个块)。
wwodge7n2#
让我们玩一小会儿,看看是怎么回事。
mount
告诉我我在/
上挂载的ext4分区上。I find its block size与:
其给出:
现在让我们创建一些大小为
1 4095 4096 4097
的文件,并使用--block-size=1
(-b
的同义词)进行测试:其结果是:
因此,我们可以看到,任何小于或等于
4096
的值实际上都占用4096
字节。然后,一旦我们穿过
4097
,它就上升到8192
,也就是2 * 4096
。显然,磁盘总是在
4096
字节的块边界存储数据。我还没有研究确切的表示是什么,但很明显
--apparent
确实考虑到了这一点。这可能导致表观大小大于实际磁盘使用量。
例如:
给出:
相关:How to test if sparse file is supported
一些可能性包括:
参考书目:
在Ubuntu 16.04中测试。
vnjpjtjt3#
比较(例如)
du -bm
与du -m
。-b
设置--apparent-size --block-size=1
,但m
将块大小覆盖为1M
。-bh
与-h
相似:-bh
意味着--apparent-size --block-size=1 --human-readable
,并且h
再次覆盖该块大小。wydwbb8l4#
文件和文件夹有其真实的大小和磁盘上的大小。
--apparent-size
是文件或文件夹的真实的大小du
时也是如此。如果你发现表观大小几乎总是比磁盘使用量高出几个数量级,那么这意味着你有很多('稀疏')文件或文件具有内部碎片或间接块。
jslywgbw5#
因为默认情况下du给出了磁盘使用量,它等于或大于文件大小。