脚本中Du磁盘分析如何排序

wen 实用脚本 10

本文目录导读:

脚本中Du磁盘分析如何排序

  1. 按大小升序排列(从小到大)
  2. 按大小降序排列(从大到小,最常用)
  3. 深入子目录一级并排序
  4. 显示总大小并指定最大深度
  5. 一个完整的脚本示例(查找并清理大文件/目录)
  6. 常见问题与陷阱
  7. 总结最佳实践

在脚本中对 du 命令的输出进行排序,通常是为了找出占用磁盘空间最多的目录或文件,最常用的方法是将 du 的输出通过管道传递给 sort 命令。

核心排序点在于:sort 默认按字典序排序,而 du 输出的数字是字符串,要对文件大小进行数值排序,必须使用 -n-h 选项。

以下是几种常见的脚本实现方式:

按大小升序排列(从小到大)

du -sk * | sort -n
  • -s:显示每个目录/文件的总计,不显示子目录详情。
  • -k:以 KB 为显示单位。
  • sort -n:按纯数字(数值)升序排列。

按大小降序排列(从大到小,最常用)

这是清理磁盘空间时最常见的需求。

du -sk * | sort -nr
  • sort -r:反转排序结果(从大到小)。
  • -n:强制数值排序。

更易读的版本(推荐在脚本中使用):

du -sh * | sort -hr
  • -h:人类可读格式(如 KB、MB、GB)。
  • sort -h这是关键sort -h 能理解人类可读的大小后缀(如 1K、2M、3G),并按实际数值排序,这比单独用 -n 更直观。
  • -r:降序。

注意: sort -hcoreutils >= 7.5(2009年后)及所有现代 Linux 发行版、macOS 中均可用,如果你的脚本目标环境非常古老(如旧版 AIX、Solaris),则需用 -k-n 组合。

深入子目录一级并排序

如果只想看当前目录下一级子目录的大小(不包括当前目录下的文件):

du -sh */ | sort -hr
  • 只匹配目录,不匹配文件。

显示总大小并指定最大深度

控制 du 的递归深度,避免输出过多。

# 显示 depth 1 以内的所有内容(包括文件),并按大小排序
du -hd1 . | sort -hr
# 显示 depth 2 以内的所有目录
du -hd2 . | sort -hr
  • --max-depth=1-d1,具体取决于 du 版本(GNU与BSD/macOS差异),在脚本中推荐使用 -d,因为它比 --max-depth 更通用(macOS 不支持 --max-depth)。

一个完整的脚本示例(查找并清理大文件/目录)

#!/bin/bash
# 功能:列出当前目录下所有子目录的大小,按大小降序排列,并只显示前10个
echo "================================"
echo " Top 10 largest directories in: $(pwd)"
echo "================================"
du -h -d 1 . 2>/dev/null | sort -hr | head -n 10

说明:

  • 2>/dev/null:屏蔽权限不足导致的错误信息(du 无法读取某些目录),使输出更干净(但注意这也会忽略真正的错误)。
  • | head -n 10:只显示前10行。

常见问题与陷阱

问题 解释 解决办法
排序错误 使用 du -sh 后接 sort -n,结果出现 1.1G 排在 800M 前面的情况 必须使用 sort -h 来识别 KMG 单位
权限不足 du 遍历 /proc/sys 或他人的家目录时会报错 添加 2>/dev/null 忽略错误(但要谨慎)
递归过深 不加 -d--max-depthdu 会输出所有嵌套子目录 根据需求设置合适的 -d N 参数
单位不统一 混合使用不同单位(如 KB 和 GB),sort -n 会错误比较 要么统一使用 -k,要么使用 sort -h

总结最佳实践

  1. 对于人类可读的报告:使用 du -sh * | sort -hr
  2. 对于脚本中需要数值计算的:使用 du -sk * | sort -nr(大小单位为 KB,易于截取字段运算)
  3. 控制深度:使用 -d 1 而不是 -s,因为 -s 等于 -d 0,看不到下一级。

抱歉,评论功能暂时关闭!