preface
1,du -sh * .[^.]* 2>/dev/null | sort -hr | head -n 10
2,find . -type f -printf ‘%s %p\\n’ 2>/dev/null | sort -nr | head -n 10 | awk ‘{printf “%8.2fM %s\\n”, $1/1024/1024, $2}’
一、du -sh * .[^.]* 2>/dev/null | sort -hr | head -n 10
命令的作用:
找出当前目录下占用空间最大的 10 个文件/目录(包括隐藏文件),并按大小从大到小排序显示。
命令拆解
du -sh * .[^.]* 2>/dev/null | sort -hr | head -n 10
1. du -sh * .[^.]*
- du:统计磁盘占用空间(Disk Usage)
- -s:summarize,只显示每个参数的总大小,不显示内部细节(不递归显示子目录内容)
- -h:human-readable,用人类易读的方式显示大小(K、M、G、T 等)
- *:匹配当前目录下所有非隐藏的文件和目录
- .[^.]*:匹配隐藏的文件和目录(以 . 开头的)
- 这个正则写法很巧妙,它能匹配 .abc、.git、.vscode 等,但不会匹配 .(当前目录)和 ..(上级目录)
所以这一部分会统计当前目录下所有可见 + 隐藏的文件和一级目录的大小。
2. 2>/dev/null
- 把错误信息(stderr)丢弃
- 常见原因:没有权限访问某些文件/目录、符号链接问题等,避免屏幕上刷一堆红字错误
3. | sort -hr
- sort:排序
- -h:human numeric sort,能正确识别 1.2G、980M、500K 这样的大小单位并正确排序
- -r:reverse,倒序(从大到小)
4. | head -n 10
- 只显示前 10 行(即占用空间最大的前 10 项)
实际效果示例
执行后可能会输出类似:
2.3G node_modules
1.8G backup.tar.gz
856M .cache
542M video.mp4
321M dist
…
常见变体 / 改进建议
-
想看更深的子目录(推荐):
du -sh * .[^.]* 2>/dev/null | sort -hr | head -n 10
# 改成递归版本:
du -sh .[^.]* * 2>/dev/null | sort -hr | head -n 20
# 或者真正递归找最大的目录:
du -h –max-depth=1 2>/dev/null | sort -hr | head -n 15 -
只看目录,不看单个文件:
du -sh */ .[^.]*/ 2>/dev/null | sort -hr | head -n 10
-
最常用、最推荐的版本(很多人直接用这个):
du -h –max-depth=1 2>/dev/null | sort -hr | head -n 15
二、find . -type f -printf ‘%s %p\\n’ 2>/dev/null | sort -nr | head -n 10 | awk ‘{printf “%8.2fM %s\\n”, $1/1024/1024, $2}’
命令的作用:
递归查找当前目录(及其所有子目录)中占用空间最大的 10 个文件,并以 MB 为单位、格式整齐地显示。
完整命令拆解
find . -type f -printf '%s %p\\n' 2>/dev/null | sort -nr | head -n 10 | awk '{printf "%8.2fM %s\\n", $1/1024/1024, $2}'
1. find . -type f -printf '%s %p\\n'
- find .:从当前目录开始递归查找
- -type f:只查找普通文件(不包含目录、符号链接等)
- -printf '%s %p\\n':
- %s:文件大小(单位是字节)
- %p:文件完整路径
- 输出格式示例:123456789 ./video.mp4
2. 2>/dev/null
- 丢弃所有错误信息(比如权限拒绝、无法访问的目录等)
3. | sort -nr
- sort:排序
- -n:按数值排序(而不是字符串)
- -r:倒序(从大到小)
4. | head -n 10
- 只保留前 10 行 → 即最大的 10 个文件
5. | awk '{printf "%8.2fM %s\\n", $1/1024/1024, $2}'
这是最后的美化输出部分:
- $1:文件大小(字节)
- $2:文件路径
- $1/1024/1024:把字节转换成 MB
- printf "%8.2fM %s\\n":
- %8.2f:保留两位小数,宽度至少 8 个字符(右对齐,让大小列对齐好看)
- M:显示单位 MB
- %s:显示文件路径
示例输出
2345.67M ./backup.tar.gz
1842.30M ./node_modules/react-dom/index.js
856.12M ./.cache/largefile.dat
542.80M ./videos/movie.mkv
…
优点与缺点
优点:
- 精确到单个文件(不会把目录整体大小算进去)
- 输出格式清晰、对齐好看
- 纯文本,适合复制
缺点:
- 如果文件非常大(几十 GB),显示为 MB 会显得数字很长
- 路径太长时显示可能换行
改进建议(更推荐的版本)
如果你想要带 G/M/K 自动单位,可以使用这个更好看的版本:
find . -type f -printf '%s %p\\n' 2>/dev/null \\
| sort -nr \\
| head -n 10 \\
| numfmt –to=iec –format="%.2f" \\
| awk '{print $1, $2}'
或者最简洁但功能类似的版本:
find . -type f -exec ls -s {} + 2>/dev/null | sort -hr | head -n 15




