在Linux上,如果你想查看一个文件的大小,可以使用命令ls -l
,但是如果你想查看一个目录的大小(包含目录下的文件),ls无法做到,基本上用ls命令查看到的目录大小都是4K(假设块大小为4K):
1 | chenximing@chenximing-MS-7823:~$ ls -lh |
这是由于linux下目录和一般文件在磁盘上都是通过元数据和数据进行记录,在创建一个目录时,分配一个元数据(inode),并为其分配一个数据块(block)。目录的数据区,也就是目录的block中,记录的是目录下文件inode和文件名的条目列表。当目录下的文件数量较少时,一个块已经足够记录,因此ls命令查看到的目录大小实际上是目录占用的block大小。当目录下文件较多时,需要更多的block来记录,此时ls命令看到的目录大小会变成8K,12K…但是对于一般文件来说ls命令能反映出其实际大小,而不是占用的block大小
所以,在Linux上,如果想要查看目录总大小时,就需要用到du命令
使用形式
命令的使用形式如下:
1 | du [参数] 文件或目录名 |
注意du也可以查看文件的大小,但是如果只是查看单个文件的大小,一般用ls命令就够了
如果不加任何参数,命令默认分析当前目录,默认单位为KB,只显示目录和目录下的子目录,不列出目录下的一般文件:
查看当前目录
1 | chenximing@chenximing-MS-7823:~$ du |
左边是目录大小,如果不加参数,默认单位为KB。右边是目录名
注意最后一行,它显示了当前目录的总大小
查看指定目录
查看一个名为dir目录的大小,其结构如下:
1 | chenximing@chenximing-MS-7823:~$ tree dir/ |
3个file文件的大小都为1K。dir目录占用1个block为4K。使用du命令查看:
1 | henximing@chenximing-MS-7823:~$ du dir/ |
从上面结果看出,如果不添加任何参数,du命令会列出目录和子目录的大小,不列出一般文件的大小
按文件实际内容统计大小
按理来说,最下层子目录dir/dir/dir的大小应该是目录dir/dir/dir的大小加上目录下文件file的大小,也就是5K。dir/dir的大小应该是10K。dir/的大小应该是15K。但是结果却是8K、16K和24K
原因在于,du对文件和目录的统计都以占用的block数量来计算。由于1K大小的文件会分配一个block,而一个block不能同时分给多个文件,因此即使分配4K大小的block还有3K空间的剩余,但是也只能被文件file使用,所以从磁盘的角度分析,这个文件的大小也是4K
那么如何以文件的实际数据内容为大小显示目录的容量?使用参数-b按字节输出:
1 | chenximing@chenximing-MS-7823:~$ du -b dir/ |
显示总计/显示所有条目
如果只关心目录dir的大小,可以使用参数-s显示总计:
1 | chenximing@chenximing-MS-7823:~$ du -s dir/ |
如果除了子目录,还想查看目录dir下一般文件的大小,使用参数-a,加入这个参数也会列出隐藏文件(注意这里说的只是“列出”,即使不用-a参数,隐藏文件也会参与计算):
1 | chenximing@chenximing-MS-7823:~$ cp dir/file dir/.file |
上面两个参数不兼容,-sa会报错
不递归显示
有时候你可能不希望在显示的结果中包含递归结果,也就是说,不想显示出子目录下的子目录或文件。可以使用如下命令:
1 | #也就是对dir下的每个文件/目录执行du -s显示总计 |
不统计子目录
如果只想统计目录和目录下的一般文件的总大小,而不包含目录下子目录的大小,可以使用-S参数:
1 | chenximing@chenximing-MS-7823:~$ du -S dir/ |
对于目录dir,现在显示的大小只统计了目录dir,文件dir/file和文件dir/.file,一共3个block,所以是12K。没有统计子目录dir的大小
目录dir/dir也只统计目录dir/dir和文件dir/dir/file,一共2个block,也就是8K,不统计子目录dir/dir/dir的大小
总结
在Linux下可能经常需要查看目录的大小,所以很有必要掌握du命令。在使用du命令时,记住默认情况下它统计的大小是根据文件占用的block来统计。如果希望按实际内容来统计大小,加入参数-b。参数列表不在这介绍,这里介绍了几种常用场景的使用方法,其它参数可以通过man手册查看,实践才是硬道理