Linux命令之du

du命令用来查看指定文件所占用或分配的磁盘空间,默认以1K(=1024bytes)为单位。如果参数是目录,它会显示 该目录下所有文件占用的总空间 ,同时递归的列出各级子目录的总占用空间,但是没有非目录文件的信息。如果没有指定文件名称,默认为当前目录:

m@meng:~/program/C_codes/tools$ ls -F
a.out*  calculators/  factorial.c  formtrans.c  README.md
m@meng:~/program/C_codes/tools$ du
16  ./calculators
44  .

可以看到,du后面没有任何参数时,给出的仅仅是当前目录以及其各级子目录的信息。
需要注意的是,目录本身也是一个文件,需要占据一定空间,而du计算的是目录所占空间以及目录下各个文件所占文件之和。ls有个选项-s也可以显示文件所占用的磁盘空间大小,我们来对比一下:

m@meng:~/program/C_codes/tools$ ls -sh
总用量 28K
 12K a.out        4.0K factorial.c  4.0K README.md
4.0K calculators  4.0K formtrans.c

很明显,对于子目录calculators,ls -s只是计算其本身所占的空间,Linux下分配给目录本身的空间一般都是4K;而du计算的是该目录下所有的文件占据的空间总和(包括目录文件本身),结果是16K。
这里要分清一个概念:文件所占的空间与文件的实际大小。所占空间指的是Linux系统分配给一个文件的基本大小,而不管分配的空间是否能用完;实际大小就是文件本身内容的长度。 可以用ls目录来观察一下:

m@meng:~/program/C_codes/tools$ ls -lsh
总用量 28K
 12K -rwxrwxr-x 1 m m 8.2K  63 22:02 a.out
4.0K drwxrwxr-x 2 m m 4.0K  54 00:16 calculators
4.0K -rw-rw-r-- 1 m m  296  63 22:02 factorial.c
4.0K -rw-rw-r-- 1 m m  422  312 21:24 formtrans.c
4.0K -rw-rw-r-- 1 m m   31  47 16:18 README.md

第一列是所占空间;第6列是实际大小(以字节B为单位)。我们看到后面三个文件的实际大小远小于所分配的空间。实际上,4K是建立文件系统时所指定的block的大小,这个数值可以在初建时更改,默认值是4K。一个block是文件系统为文件分配空间时的基本单位,比如第一个文件a.out,用掉2个block之后还剩0.2K,但是还是要为这0.2K再分配一个4K的block。所以,如果一个系统中大多是不足4K的小文件,那么指定block size为4K是很浪费空间的。


下面是各个选项:

  • -a:当参数是目录时,同时列出目录所包含的各种文件的占用空间大小,而不仅仅是各级子目录。

  • -c:显式统计目录的总占用空间,即会专门有一行显示‘total’或‘总用量’。其实这个选项可有可无,因为du显示的指定目录的占用空间其实就是该目录的总用量:

 m@sys:~/program/C_codes/tools/calculators$ du -ca
4   ./calculator.l
4   ./Makefile
4   ./calculator.y
16  .
16  总用量

可以看到,‘.’目录(当前目录)和总用量的结果一样。

  • -B:指定显示单位,而不是默认的1KB。
    那么-B后面可以跟哪些参数呢?分两套标准:工业标准和计算机标准。

    • 在计算机标准中,单位分别是:1、K、M、G….这里相邻单位之间的倍数是1024,数字‘1’指的就是一个字节,1K = 1024字节,1M = 1024K…;
    • 在工业标准中,单位分别是:1、KB、MB、GB…相邻单位的倍数是1000,1K = 1000字节,1M = 1000K …
      单位前面可以加数字,如-B 2K
 m@sys:~/program/C_codes/tools$ du -B 1
16384   ./calculators
28672   .

m@sys:~/program/C_codes/tools$ du -B k
16K ./calculators
28K .
  • - -apparent-size:显示文件实际的大小,而不是分配的空间大小:
m@sys:~/program/C_codes/tools$ du --apparent-size
6   ./calculators
10  .
m@sys:~/program/C_codes/tools$ du
16  ./calculators
28  .

从结果看以看出,加不加这个参数区别还是很明显的;默认以K为单位,可以加上-B 1选项以字节为单位显示,就可以与ls- l显示一样的大小:

m@sys:~$ du --apparent-size -B 1 formtrans.c  
422 formtrans.c
m@sys:~$ ls -l formtrans.c 
-rw-rw-r-- 1 m m 422  312 21:24 formtrans.c

不过这一招对于目录文件却不管用,因为正如上面所说,对于目录,du总是计算其包含的所有文件的总和,而不是其本身:

m@sys:~/program/C_codes/tools/calculators$ ls -al
总用量 20
drwxrwxr-x 2 m m 4096  54 00:16 .
drwxrwxr-x 3 m m 4096  424 11:24 ..
-rw-rw-r-- 1 m m  340  424 14:10 calculator.l
-rw-rw-r-- 1 m m  673  54 00:16 calculator.y
-rw-rw-r-- 1 m m  367  424 14:20 Makefile
m@sys:~/program/C_codes/tools/calculators$ du --apparent-size -B 1  -a .
340 ./calculator.l
367 ./Makefile
673 ./calculator.y
5476    .

我们可以对后面那个结果计算一下:5476 - 673 - 367 - 340 = 4096,正好是一个目录文件本身的实际大小,和ls -l的结果一样。

  • -b:等价于–apparent-size –block-size=1
 m@sys:~/program/C_codes/tools/calculators$ du -a --apparent-size -B 1
340 ./calculator.l
367 ./Makefile
673 ./calculator.y
5476    .

m@sys:~/program/C_codes/tools/calculators$ du -ab
340 ./calculator.l
367 ./Makefile
673 ./calculator.y
5476    .
  • -k:等价于-B 1k
 m@sys:~/program/C_codes/tools/calculators$ du -a -B 1k
4   ./calculator.l
4   ./Makefile
4   ./calculator.y
16  .

m@sys:~/program/C_codes/tools/calculators$ du -a -k
4   ./calculator.l
4   ./Makefile
4   ./calculator.y
16  .
  • -m:和-k类似。实际上,-k和-m这类的选项在很多命令中都有出现。

  • -S:从总结果中减去所有子目录的大小:

 m@sys:~/program/C_codes/tools$ du --apparent-size -B 1 -S .
5476    ./calculators
4549    .
m@sys:~/program/C_codes/tools$ du --apparent-size -B 1  .
5476    ./calculators
10025   .
  • -h:print sizes in human readable format,实在没什么好说的。
  • -s:只显示该目录的总量,不显示各级子目录。
  • -d:指定要显示的子目录的层数,如:-d 0就是目录自己本身,等价于-s;-d 1就是同时显示一级子目录;-d 2显示孙目录。。。以此类推。

全文完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值