Linux查看目录大小

在Linux上,如果你想查看一个文件的大小,可以使用命令ls -l,但是如果你想查看一个目录的大小(包含目录下的文件),ls无法做到,基本上用ls命令查看到的目录大小都是4K(假设块大小为4K):

1
2
3
4
5
6
7
8
9
10
11
12
13
chenximing@chenximing-MS-7823:~$ ls -lh
...
...
-rw-rw-r-- 1 chenximing chenximing 16K 9月 27 16:38 sysstat-8.0.4.1.tar.gz
-rwxrwxr-x 1 chenximing chenximing 492 5月 2 2017 tmp_lat.sh
drwxr-xr-x 2 chenximing chenximing 4.0K 4月 5 2017 公共的
drwxr-xr-x 2 chenximing chenximing 4.0K 4月 5 2017 模板
drwxr-xr-x 2 chenximing chenximing 4.0K 4月 5 2017 视频
drwxr-xr-x 2 chenximing chenximing 4.0K 10月 9 11:39 图片
drwxr-xr-x 5 chenximing chenximing 4.0K 10月 11 10:15 文档
drwxr-xr-x 2 root root 4.0K 4月 6 2017 下载
drwxr-xr-x 2 chenximing chenximing 4.0K 4月 5 2017 音乐
drwxr-xr-x 2 chenximing chenximing 4.0K 8月 20 17:53 桌面

这是由于linux下目录和一般文件在磁盘上都是通过元数据和数据进行记录,在创建一个目录时,分配一个元数据(inode),并为其分配一个数据块(block)。目录的数据区,也就是目录的block中,记录的是目录下文件inode和文件名的条目列表。当目录下的文件数量较少时,一个块已经足够记录,因此ls命令查看到的目录大小实际上是目录占用的block大小。当目录下文件较多时,需要更多的block来记录,此时ls命令看到的目录大小会变成8K,12K…但是对于一般文件来说ls命令能反映出其实际大小,而不是占用的block大小

所以,在Linux上,如果想要查看目录总大小时,就需要用到du命令

使用形式

命令的使用形式如下:

1
du [参数] 文件或目录名

注意du也可以查看文件的大小,但是如果只是查看单个文件的大小,一般用ls命令就够了

如果不加任何参数,命令默认分析当前目录,默认单位为KB,只显示目录和目录下的子目录,不列出目录下的一般文件:

查看当前目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
chenximing@chenximing-MS-7823:~$ du
28 ./bin
1700 ./blktrace/cow
110380 ./blktrace
708 ./.compiz/session
712 ./.compiz
16 ./.vim/autoload
...
...
4 ./.config/menus
4 ./.config/evolution/sources
8 ./.config/evolution
8 ./.config/ibus/bus
12 ./.config/ibus
4 ./.config/yelp
8 ./.config/Mendeley Ltd.
8 ./.config/ubuntu-ui-toolkit
383060 ./.config
29800588 . #当前目录总大小

左边是目录大小,如果不加参数,默认单位为KB。右边是目录名

注意最后一行,它显示了当前目录的总大小

查看指定目录

查看一个名为dir目录的大小,其结构如下:

1
2
3
4
5
6
7
8
9
chenximing@chenximing-MS-7823:~$ tree dir/
dir/
├── dir
│   ├── dir
│   │   └── file
│   └── file
└── file

2 directories, 3 files

3个file文件的大小都为1K。dir目录占用1个block为4K。使用du命令查看:

1
2
3
4
henximing@chenximing-MS-7823:~$ du dir/
8 dir/dir/dir
16 dir/dir
24 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
2
3
4
chenximing@chenximing-MS-7823:~$ du -b dir/
5120 dir/dir/dir
10240 dir/dir
15360 dir/

显示总计/显示所有条目

如果只关心目录dir的大小,可以使用参数-s显示总计:

1
2
chenximing@chenximing-MS-7823:~$ du -s dir/
24 dir/

如果除了子目录,还想查看目录dir下一般文件的大小,使用参数-a,加入这个参数也会列出隐藏文件(注意这里说的只是“列出”,即使不用-a参数,隐藏文件也会参与计算):

1
2
3
4
5
6
7
8
9
chenximing@chenximing-MS-7823:~$ cp dir/file dir/.file
chenximing@chenximing-MS-7823:~$ du -a dir/
4 dir/dir/dir/file
8 dir/dir/dir
4 dir/dir/file
16 dir/dir
4 dir/file
4 dir/.file
28 dir/

上面两个参数不兼容,-sa会报错

不递归显示

有时候你可能不希望在显示的结果中包含递归结果,也就是说,不想显示出子目录下的子目录或文件。可以使用如下命令:

1
2
3
4
#也就是对dir下的每个文件/目录执行du -s显示总计
chenximing@chenximing-MS-7823:~$ du -s dir/*
16 dir/dir
4 dir/file

不统计子目录

如果只想统计目录和目录下的一般文件的总大小,而不包含目录下子目录的大小,可以使用-S参数:

1
2
3
4
chenximing@chenximing-MS-7823:~$ du -S dir/
8 dir/dir/dir
8 dir/dir
12 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手册查看,实践才是硬道理

文章目录
  1. 1. 使用形式
  2. 2. 查看当前目录
  3. 3. 查看指定目录
    1. 3.1. 按文件实际内容统计大小
    2. 3.2. 显示总计/显示所有条目
    3. 3.3. 不递归显示
    4. 3.4. 不统计子目录
  4. 4. 总结
|