Linux命令(39)——du命令

1.简介

du(disk usage)命令用于查看指定的目录或文件所占用的磁盘空间。

2.命令格式

du [OPTION]... [FILE]...
du [OPTION]... --files0-from=F

3.选项说明

-a, --all:递归显示目录与其包含的所有文件及子目录的大小,默认仅显示目录及其子目录的大小。
--apparent-size:显示文件或目录自身大小,而不是它们占用的磁盘空间大小。文件或目录占用磁盘空间的大小与它们自身大小有时候并非完全一致,有可能比较大,原因可能是稀疏文件中存在空洞,内部碎片,间接blocks等。大小等同与使用命令"wc -c""ls --blokc-size=1"查看的字节大小。
-B, --block-size=SIZE:使用SIZE作为block的大小,SIZE可以取对应的数值,或如下字符串: KB 1000, K 1024, MB 1000*1000, M 1024*1024,以及G, T, P, E, Z, Y等;
-b,-bytes:显示目录或文件大小时,以byte为单位,等同于选项--apparent-size --block-size=1-c, --total:显示占用磁盘空间大小的总和。
-D, --dereference-args:显示指定符号连接的源文件大小。
--files0-from=F:列出在文件F中指出的文件名称,如果F等于连字符-,则从标准输入读取文件名称。
-H:等同于-D, --dereference-args。
-h, --human-readable:以易读的单位显示大小,例如以KMG等为单位进行显示。
--si:等同于-h,但是KMG等以1000而非2014为换算单位。
-k:以K为单位显示,等同于--block-size=1K。
-l, --count-links:多次计算硬链接文件。
-m:以M为单位显示,等同于--block-size=1M。
-L, --dereference:显示符号链接的源文件大小。
-P, --no-dereference:默认选项,不显示符号链接源文件大小。
-0, --null:以NULL字符取代输出的换行符。
-S, --separate-dirs:不显示子目录大小(不太明白,为何使用时仍然显示子目录大小)。
-s, --summarize:只显示所给文件或目录的总大小。
-x, --one-file-system:以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X, --exclude-from=FILE:跳过符合指定的文件。
--exclude=PATTERN:跳过符合指定模式的文件或目录。
--max-depth=N:指定递归显示的最大目录深度,--max-depth=0等同于--summarize。
--time:显示文件或目录最后修改时间。
--time=WORD:显示指定类型的时间,而非默认的最后修改时间。WORD可取值为atime、access、use(访问时间),或者ctime、status(状态改变时间)。
--time-style=STYLE:使用指定的时间格式显示时间,STYLE可取值为full-iso, long-iso, iso, +FORMAT,其中FORMAT解析方式等同于date命令。
--help:显示帮助信息。
--version:显示版本信息。

4.常用示例

(1)显示指定文件或目录占用磁盘空间大小。

du -sh [file or directory] 

(2)显示指定目录及其所有子目录的大小。

du -h [directory]

5.注意事项

(1)文件大小与占用磁盘空间大小的区别。
文件大小(又名 apparent size)是文件自身实际大小,与占用磁盘空间大小(又名 occupied space size)有本质的区别。举个例子,创建一个1字节的文件,使用du显示的为4KB,使用ls显示为1B,示例如下:

[dablelv@TENCENT64 ~/test/sparseFile]$ echo -n 1 > 1B.txt
[dablelv@TENCENT64 ~/test/sparseFile]$ ls -l 1B.txt
-rw-rw-r-- 1 dablelv dablelv 1 Apr  4 19:14 1B.txt
[dablelv@TENCENT64 ~/test/sparseFile]$ du -h 1B.txt
4.0K    1B.txt

这里我们先创建一个文件1B.txt,大小是一个字节,ls显示出的size就是1Byte,而1B.txt这个文件在硬盘上会占用1个block,因为Linux文件系统存储最小单位为block,不足1个block大小的文件也要占用1个block大小。这里的一个block等于4K。

(2)稀疏文件(sparse file)
稀疏文件就是在文件中留有很多空余空间,称为空洞(hole),留备将来插入数据使用,这些空洞被填充为NULL字符,特点是文件系统并不会为空余空间分配磁盘空间。

使用如下代码创建稀疏文件:

#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, 10240, SEEK_CUR);
    write(fd, "\0", 1);

return 0;
}

编译生成后执行,创建稀疏文件sparse.file,使用ls和du命令分别查看文件大小与占用磁盘空间大小,发现稀疏文件空洞部分并不占用磁盘空间,被文件系统压缩存储。

[dablelv@TENCENT64 ~/test/sparseFile]$ ll sparse.file
-rw---x--T 1 dablelv dablelv 10241 Apr  4 20:16 sparse.file
[dablelv@TENCENT64 ~/test/sparseFile]$ du -h sparse.file 
4.0K    sparse.file

6.小结

历时近5h,终于完成了此篇blog,其中对于选项-S还存有疑惑,以及文件碎片(fragmentation)、间接块(indirect blocks)等相关概念比较模糊,后续了解后继续补充,也请请知者不吝指教,留言告知,万分感谢!对于文中不足甚至错误之处,也请大家批评指正。


参考文献

[1]du manual
[2]为什么用ls和du显示出来的文件大小有差别?

猜你喜欢

转载自blog.csdn.net/k346k346/article/details/79822570