du命令的用法
du命令的用法
前言
在Linux系统中,我们知道,用ls -al
会显示出当前目录下的文件和文件夹信息,但这种方式显示出来的文件夹大小一般都是4096,而我们想知道的一般情况下是这个文件夹中所有文件的总大小,而4096的结果显然和我们的预期有所出入. 而要得到我们想要的结果,就需要用到du命令.因此在这里做简要介绍.
Linux下的目录大小为什么总是4096
首先我们需要了解前言中提到的问题,为什么ls -al
显示出的目录大小会是4096呢, 这是因为, 在Linux系统下,一切皆文件, 因此目录也是文件,所以通过ls -al
显示的目录大小并非常规意义上包含其子文件的总大小, 而是单纯指目录的大小.这一点和Windows并不一样. 那为什么是4096呢?这就要从Linux文件的存储机制说起。
文件存储在硬盘上,硬盘最小的存储单位是扇区(Sector),一般情况下,每个扇区存储512字节(0.5KB),但操作系统读取硬盘的时候,不会一个扇区一个扇区地读,这样效率太低,而是一次性连续读取多个扇区,即一次读取一个**块 (block),这种由多个扇区组成的块,是文件存取的最小单位 **,而最常见的块的大小,是4KB,即连续八个sector组成一个block。
文件数据都存储在block中,那么很显然,我们还需要一个地方存储文件的元信息。比如文件的创建者、创建日期、大小等等。这种储存文件元信息的区域叫做inode,中文译为“索引节点”。每个文件都对应一个inode。而Linux系统中,目录(directory)也是一种文件,而目录文件的结构非常简单,就是一系列目录项的列表,每个目录项,由两部分组成:所包含的文件名,以及该文件名对应的inode。一般来讲,存储这些信息一个block绰绰有余。因此目录一般大小显示为4096。
但下面这两点需要明确:
- Linux下的目录大小并不都是4096
- OS系统块的大小是可以修改的
du命令的常见用法
-
du命令的含义和用处:
NAME du - estimate file space usage DESCRIPTION Summarize disk usage of the set of FILES, recursively for directories. Mandatory arguments to long options are mandatory for short options too. SYNOPSIS du [OPTION]... [FILE]... 名字 du - 测量文件占用空间 描述 能对文件以及递归地对文件夹汇总其所占用的空间。对于长选项所必需的参数对于短选项也是必需的。
-
du命令常用的选项:
-a, --all write counts for all files, not just directories -h, --human-readable print sizes in human readable format --si, like -h, but use powers of 1000 not 1024 -s, --summarize display only a total for each argument -d, --max-depth=N print the total for a directory(or file, with --all) only if it is N or fewer levels below the command line argument; --max-depth=0 is the same as --summarize -L, --dereference dereference all symbolic links --exclude=PATTERN exclude files that match PATTERN PATTERNS PATTERN is a shell pattern(not a regular expression). The pattern ? matches any one character, whereas * matches any string (composed of zero, one or multiple characters). For example, *.o will match any files whose name end in .o , Therefore, the command du --exclude=*.o will skip all files and subdirectories ending in .o(including the file .o itself)
-
关于常用命令的一些说明:
-
-a
我们需要明确的是
du
在默认情况下只会显示出当前位置下所有目录的disk usage,但倘若当前目录下还有一些文件,虽然它们的大小会被归总到.
目录下,但是这些文件自身的大小却不会被显示出来,如:[test01@x86c stencil]$ ls test.f90 tutorial [test01@x86c stencil]$ du 0 ./tutorial/test1 292 ./tutorial 640 .
可以看到,
du
的结果显示出了当前目录下的所有文件夹以及子文件夹的大小,文件的大小虽然参与计算,但是却不会显示在结果中。而当我们加上-a
选项,则当前目录下的文件包含子文件夹中的文件也会被显示出来:[test01@x86c stencil]$ ls test.f90 tutorial [test01@x86c stencil]$ du -a 12 ./test.f90 4 ./tutorial/cplus.cu 36 ./tutorial/cplus.o 8 ./tutorial/cuda_data.mod 4 ./tutorial/main.f90 36 ./tutorial/main.o 4 ./tutorial/mk.sh 4 ./tutorial/plus.cuf 64 ./tutorial/plus.o 132 ./tutorial/test 0 ./tutorial/test1 292 ./tutorial 336 ./.test.f90.un~ 640 .
-
-h
加上
-a
之后的结果显然还不是很能让人满意,因为前面显示大小的数字让人有些不明所以,du
输出的文件大小的默认单位是K,注意这里的K和KB不一样的,这一点在du
的手册中有清晰的表述,原文如下:Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000)
因此,
1024 bytes = 1K
, 而1000 bytes = 1KB
,我们可以通过添加--block-size =1KB
的方式将单位转化为KB而非K,稍微说了一些题外话,而要结果更容易让人阅读,就可以加上-h
选项,结果会自动加上合适的单位展示出来:[test01@x86c stencil]$ du -h 0 ./tutorial/test1 292K ./tutorial 640K .
--si
选项则正如前面所介绍的,和-h
作用相仿,仅仅将单位的进制由1024变成了1000 -
-s
有时,我们不想知道每个文件或子文件夹的大小,只想知道当前目录的总大小。此时就可以使用
-s
选项,如果不额外指定要输出的内容,它默认只会输出.
文件夹的大小:[test01@x86c stencil]$ du -sh 640K .
-
-d
我们经常会遇到这样一种情况:想查看当前目录下所有文件及文件夹的大小,但如果我们用
du -h
,则只能显示出文件夹,无法显示文件,如果我们用du -ah
,则虽然当前目录下的文件会被显示出来,但子文件夹下的文件也会被显示出来。前面说到的这几个选项似乎都结局不了这个问题,此时就需要用到-d
选项,通过明确给出N
层数,结合-a
选项,就可以查看从当前目录开始计算的任意层数的所有文件的大小了。需要注意的是,0代表.
文件夹,1代表.
及.
下所有文件,2代表.
下所有文件及其更深一层的子文件,以此类推。因此回到前面提出的问题,想要查看当前目录下所有文件及文件夹的大小,只需要:du -ah -d 1
即可。查看2层及以上深度的目录大小一般是不怎么常用的,而当
depth=0
时又和dh -sh
的效果是完全一致的,因此depth=1
的情况是最为常见的,有必要进行记忆。另外,长选项--max-depth=1
和-d 1
是完全一样的效果,虽然长选项更加容易理解,在其他资料中也更常见,但个人觉得,simple is better than complex
,还是短选项更加好用。 -
-L
-L
主要是应对目录下存在软链接的情况 ,我们知道,软链接事实上只是个快捷方式,并不会对当前磁盘空间大小造成什么影响,因此du
命令在默认情况下是会直接忽略掉软链接的,它们甚至都不会出现在结果中,参见du(1) 中的这句话:-P, --no-dereference don't follow any symbolic links (this is the default)
因此,如果你想要查看软链接所指向的目录的大小,那么就需要显式地加入
-L
选项 -
--exclude=PATTERN
如果有一些文件你不想要参与统计,那么可以通过此命令将其排除出去,
PATTERN
的格式在前面已经有叙述,另外还可以通过指定文件大小的上限或下限来排除文件,详见du(1)
-
-
总结
综上所述,
du
的常用用法主要有以下几种:du -sh #查看当前目录的总大小 du -h #查看当前目录及其子目录的大小 du -ah -d 1 #查看当前目录及其子目录及其子文件的大小
参考
du(1) manual