“ ls -lh”报告的总大小小于单个大小的总和


14

在什么情况下ls -lh显示的总数小于单个文件的总数?例如:

$ ls -lh /var/lib/nova/instances/_base
total 100G
-rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
-rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
-rw-rw-r-- 1 nova         nova  42G 2012-03-08 15:24 1574bddb75c78a6fd2251d61e2993b5146201319.part
-rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
-rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
-rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
-rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm

编辑:现在显示一些额外的标志是每个请求在注释中:

$ ls -aiFlh  /var/lib/nova/instances/_base/
total 143G
29884440 drwxrwxr-x 2 nova         nova 4.0K 2012-03-08 15:45 ./
29884427 drwxr-xr-x 6 nova         nova 4.0K 2012-03-08 15:05 ../
29884444 -rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
29884445 -rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
29884468 -rw-r--r-- 1 nova         nova  65G 2012-03-08 15:59 1574bddb75c78a6fd2251d61e2993b5146201319.converted
29884466 -rw-rw-r-- 1 nova         nova  58G 2012-03-08 15:35 1574bddb75c78a6fd2251d61e2993b5146201319.part
29884446 -rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
29884467 -rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
29884443 -rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
29884442 -rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
29884447 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
29884441 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm

不知道这些链接中的任何一个是否可以列出ls -aiFlh
bsd 2012年

@bdowning添加了其他标志。请注意,目录已进行了一些更改,但问题仍然存在
Lorin Hochstein 2012年

如何du -h --total为同一目录?
bsd 2012年

Answers:


20

如果文件稀疏,则会发生这种情况:

$ mkdir test; cd test
$ truncate -s 1000000000 file-with-zeroes
$ ls -l
total 0
-rw-r--r-- 1 gim gim 1000000000 03-08 22:18 file-with-zeroes

稀疏文件是尚未填充文件系统块(或仅部分填充)的文件。当您读取稀疏文件的非填充区域时,将获得零。这样的空白区域不需要实际的磁盘空间,并且报告的“总计” ls对应于文件所占用的磁盘空间(就像du)。


3
您的KVM磁盘映像很可能充满了孔:-)
斯特凡希门尼斯

coreutils的文件说,-s/ --size选项“打印每一个文件,左侧是文件名的磁盘分配,这是磁盘空间由文件的使用量,这通常是有点超过该文件的大小,但能如果文件有孔,则减少。” -l当然,该选项也会打印尺寸。
Francesco Turco 2012年

2

请注意ls -ldu提供的输出有细微但非常重要的区别。尝试这个:

dd if=/dev/urandom of=aaa bs=1024 count=1

现在

ls -l aaa
-rw-r--r-- 1 abc abc 1024 2012-03-08 15:45 aaa

鉴于

du -h aaa
4.0K    aaa

这是因为文件系统以4096为块分配大小(在我的Linux机器上)。它称为IO块。您可以通过以下方式查看此内容:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file

另外,您可以尝试stat我建议的empty-file,即使报告文件大小为1G,您也会看到Blocks的数量为0。
斯特凡希门尼斯

@StéphaneGimenez为什么为什么将Blocks报告为8?512字节大小的块是什么?
Ankur Agarwal 2012年

1
有点奇怪,在过去,IO块的大小为512,但现在通常为4K。stat报告存储所有4K块所需的旧块的等效数量(即4K块实际数量的8倍)。
斯特凡希门尼斯

1

接受的答案是绝对正确的,即使您希望看到明显的尺寸,也可以使用:

du --apparent-size

打印外观大小,而不是磁盘使用情况;尽管表观大小通常较小,但由于(“稀疏”)文件中的漏洞,内部碎片,间接块等,它可能会更大

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.