关于du 命令,这是一个用于估计文件空间使用情况的 UNIX 和 Linux 命令。du命令报告目录树​​的大小,包括其所有内容和单个文件的大小。

这使得它可用于追踪占用大量空间的文件,即在硬盘驱动器或其他存储介质上消耗大量或过多空间的目录和文件。

什么是目录树?

目录树是由单个目录(称为父目录或顶级目录)及其所有级别的子目录(即目录中的目录)组成的目录层次结构。任何目录都可以看作是它自己的目录树的开始,至少如果它包含子目录的话。因此,典型的计算机包含大量目录树。


大部分Linux系统是默认不安装该命令的,需要自己安装一下。

du 命令的使用

du 命令是用于报告文件系统磁盘空间使用情况的命令行实用程序。 它可用于找出文件和文件夹的磁盘使用情况并显示占用空间的内容。

du 的基本语法是:

du [选项] [目录和/或文件]

方括号中的项目是可选的。当不带选项或参数使用时,du 列出以当前目。

任何目录的空间消耗由其中所有文件及其所有级别的所有子目录占用的空间组成。报告末尾的最后一行给出了目录树的总空间消耗。

du 命令可以接受目录和目录的任意组合

du 命令可以提供有关系统上以参数形式给出名称的任何目录树或文件的信息。

上面报告当前位于 ls 目录和pwd目录两个文件的大小。

du 命令可以接受文件和目录的任意组合

du选项的使用

与 Linux 和其他类 Unix 操作系统上的大多数命令一样,du 有许多选项,其中一些是常用的。根据特定的操作系统和 du 的版本,选项可能会有所不同。

  • du -h选项

最有用的选项之一是 -h,它可以通过以千字节 (K)、兆字节 (M) 和千兆字节 (G) 而不是仅以默认千字节显示输出,从而使输出更易于阅读。
du命令可用于显示当前目录中所有子目录的大小以及当前目录的总大小,均使用适当的 K、M 或 G 格式,因此在代码中,可以这样定义宏。

/* 以可读的形式为磁盘上的文件大小设置宏  */
#define gigaByte (1 << 21)      /* G 是千兆字节的输出符号   */
#define megaByte (1 << 11)      /* M 是兆字节的输出符号  */
#define kiloByte (1 << 1)       /* K 是千字节输出中的符号  */
  • du -s选项

-s选项告诉 du 仅报告目录树​​占用的总磁盘空间并抑制其子目录的单个报告。

上面的内容将以易于阅读的格式提供当前目录占用的总磁盘空间。

  • du -a选项

-a选项告诉 du 不仅要报告目录树​​中每个级别的每个目录的总磁盘使用量,还要报告树中任何位置的每个单独文件的空间消耗。


将列出 /etc 目录中用户具有读取权限的每个目录和文件的名称和大小。

  • –max-depth= 选项

另一个有用的选项是 --max-depth=,它指示 du 将其子目录及其大小列出到目录树中任何所需的深度级别。


du 仅列出当前目录中目录的第一层(即层)及其大小。


du 与过滤器一起使用

与类 Unix 操作系统上的其他命令一样,du 可以通过管道链接到过滤器以创建强大的命令管道。

例如,要根据大小排列输出项,du 可以通过管道传递到 sort 命令,其 -n 选项告诉它首先按数字顺序列出最小文件的输出:

由于 du 生成的输出通常会超过一次显示器屏幕所能容纳的数量,因此输出会高速飞逝并且几乎无法读取。

du -h | less

grep 过滤器可用于在 du 的输出中搜索任何所需的字符串。

du 可用于生成目录树中消耗大量磁盘空间的目录和文件列表的一种方法是使用 grep 搜索所有包含大写字母 M 的行(即, 表示兆字节)或 G(表示千兆字节)


du命令源码实现

/*
blkcnt_t 是 <sys/types.h> 中的数据类型
以可读形式计算块大小的函数 */
void blockMath(char *entryName, blkcnt_t numBlocks, int humanFlag)
{int size;char label;char sizeBuf[MAX];/* 如果未设置 -h 标志  */if (!humanFlag) printf("%-8ld%s\n", (numBlocks + 1) / 2, entryName);/* 如果给出了 -h 标志,该标志以可读的形式返回输出  */else {if (numBlocks >= gigaByte) {size = numBlocks / gigaByte;label = 'G';}else if (numBlocks >= megaByte) {size = numBlocks / megaByte;label = 'M';}else if (numBlocks >= kiloByte) {size = numBlocks / kiloByte;label = 'K';}else {size = numBlocks * bytesPerBlock;label = ' ';}/* 将格式化输出写入 sizeBuf,这里 10 指定写入 sizeBuf 的字节数  */snprintf(sizeBuf, MAX, "%d%c", size, label);printf("%-8s%s\n", sizeBuf, entryName);}
}/* 函数用于使用 #include<sys/types.h> 遍历目录和文件,并返回该目录的块数  */
blkcnt_t TraverseDir(char *entryName, int printFileFlag, int maxDepthFlag, int maxDepthValue, int humanFlag)
{blkcnt_t totalSize = 0;struct stat st;char buffer[PATH_MAX];DIR *dir;struct dirent *newEntry;/* 如果目录名称错误或路径不正确 */if (lstat(entryName, &st)) {perror(entryName);exit(-1);}/* 用于打开和遍历目录  */if (S_ISDIR(st.st_mode) && (dir = opendir(entryName))) {while ((newEntry = readdir(dir)))if (strcmp(newEntry->d_name, ".") && strcmp(newEntry->d_name, "..")) {snprintf(buffer, PATH_MAX, "%s/%s", entryName, newEntry->d_name);/* 递归调用函数直到 maxDepthValue 变为 0  */totalSize += TraverseDir(buffer, printFileFlag, maxDepthFlag, maxDepthValue - 1, humanFlag);}closedir(dir);}/* 添加块大小  */totalSize += st.st_blocks;if ((printFileFlag || S_ISDIR(st.st_mode)) && (maxDepthValue >= 0 || !maxDepthFlag))blockMath(entryName, totalSize, humanFlag);return totalSize;  /* 返回块数  */
}



总结

du 命令通常被系统管理员用作自动监控和通知程序的补充,有助于防止关键目录和分区变满。已满或几乎已满的目录和分区会导致系统变慢,阻止用户登录,甚至导致系统崩溃。

du 命令只能用于估计用户具有读取权限的目录和文件的空间消耗。因此,普通用户通常无法使用 du 来确定属于其他用户的文件或目录的空间消耗,包括属于 root 帐户的文件或目录。

Linux 下du命令详解及代码实现相关推荐

  1. Linux下top命令详解

    Linux下top命令详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不断刷 ...

  2. linux cat命令缩写,linux下cat命令详解

    cat 能够一同显现多个文件的内容,比方咱们能够在一个cat指令上一同显现两个文件的内容;那么你知道linux下cat命令详解么?接下来是小编为大家收集的linux下cat命令详解,欢迎大家阅读: l ...

  3. linux中top指令,Linux下top命令详解

    原标题:Linux下top命令详解 1.简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top显示系统当前的进程和其他状况 ...

  4. linux下dd命令详解

    linux下dd命令详解    名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file 使用方式: dd [option] 如果 ...

  5. linux下scp命令详解

    http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792179.html linux下scp命令详解 http://www.9usb.net/20 ...

  6. linux下tree命令详解

    From:http://blog.163.com/ly_89/blog/static/186902299201161302812880/ linux下tree命令详解---linux以树状图逐级列出目 ...

  7. linux系统rar命令行,Linux下rar命令详解

    Linux下rar命令详解 发布时间:2010-05-24 23:28:23   作者:佚名   我要评论 通常rar命令由一个主命令加若干选项(可选)构成,操作文档为操作施加的.rar文件对象,文件 ...

  8. linux中的ps fx命令,Linux下ps命令详解 Linux下ps命令的详细使用方法

    Linux下ps命令详解 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断 ...

  9. linux 命令xargs,Linux下xargs命令详解

    Linux下xargs命令详解 1. 简介   之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: find /sbin -pe ...

  10. linux的ftp命令大全文库,linux下ftp命令详解

    linux下ftp命令详解 (11页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 登录FTP服务器的命令格式:ftp [-v][-d][- ...

最新文章

  1. NC:MetaSort通过降低微生物群落复杂度以突破宏基因组组装难题
  2. 二值网络--XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
  3. JavaScript基础总结(五)——Math对象
  4. 查找标题已知的窗口句柄,遍历窗口控件句柄
  5. 程序员!别逼自己刷题了!每天花10分钟做这件事,编程能力暴增!
  6. leetcode刷题日记- 超级次方
  7. 【合集】高等数学随堂笔记-乐经良老师-全系列内容汇总
  8. mysql设计用户标签库_针对Tag/标签的数据库设计思考 | 学步园
  9. android五线谱播放器,口袋五线谱app下载
  10. 18年研赛数学建模心得
  11. autoCAD绘制简单三维立体图形
  12. 荣达嵌入式打印机打印效果
  13. 免费的天气查询 API 接口分享
  14. C++设计模式 | Factory工厂模式(简单工厂、工厂方法、抽象工厂)
  15. SQL:DBMS函数的差异(限制输出结果、拼接字段)
  16. vsftp配置详解篇
  17. 大数据基础知识全集,大数据爱好者收藏必备
  18. Session、Cookie和Token的简介、技术核心和实现原理
  19. python雷达图详解_python绘制雷达图实例讲解
  20. SAAS建站网站和传统建站的区别

热门文章

  1. anaconda conda 切换为国内源
  2. java编写桌球游戏素材小球图片_java 桌球小游戏仅一份代码
  3. java 动态修改配置文件_Java 项目中一种简单的动态修改配置即时生效的方式 WatchService...
  4. Javascript中的shift() 、unshift() 和 pop()、push()区别
  5. SimpleFOC调参3-PID参数整定攻略
  6. 利用mlxtend进行数据关联分析
  7. C/C++函数调用约定(基于X86架构下)
  8. web如何加入视频?video
  9. 使用android新特性:Material Design
  10. 音乐治疗在计算机的应用,音乐治疗中虚拟现实(VR)技术的应用