曾经有几次,我用ls和du查看一个文件的大小,发现二者显示出来的大小并不一致,例如:
bl@d3:~/test/sparse_file$ ls -l fs.img
-rw-r--r-- 1 bl bl 1073741824 2012-02-17 05:09 fs.img
bl@d3:~/test/sparse_file$ du -sh fs.img
0 fs.img
这里ls显示出fs.img的大小是1073741824字节(1GB),而du显示出fs.img的大小是0。
原来一直没有深究这个问题,今天特来补上。
造成这二者不同的原因主要有两点:
- 稀疏文件(sparse file)
- ls和du显示出的size有不同的含义
先来看一下稀疏文件。稀疏文件只文件中有“洞”(hole)的文件,例如有C写一个创建有“洞”的文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int fd = open("sparse.file", O_RDWR|O_CREAT);
lseek(fd, 1024, SEEK_CUR);
write(fd, "