欢迎各位兄弟 发布技术文章
这里的技术是共享的
指定目录: du -sh /path/to/directory/* | sort -rh | head
linux # du -sh * | sort -rh | head 命令详解
du -sh * | sort -rh | head
这个命令组合用于查找当前目录中占用空间最大的文件或目录。下面是对每个部分的详细解释:
du -sh *
du (disk usage):显示磁盘使用情况
-s:显示每个指定项目的总计大小(不显示子目录详情)
-h:以人类可读的格式显示(KB、MB、GB等)
*:匹配当前目录下的所有文件和目录
| sort -rh
|:管道,将前一个命令的输出传递给下一个命令
sort:排序命令
-r:反向排序(从大到小)
-h:以人类可读的数字大小排序(能正确识别KB、MB、GB等单位)
| head
head:显示输出结果的前10行 ( 默认是 前10 行,,,,想显示前20行的话,使用 head -n 20 或者 head -20)
这个命令组合会:
计算当前目录下每个文件/目录的磁盘使用量
以人类可读格式显示
按照大小从大到小排序
只显示最大的10个项目
快速找出占用大量空间的文件/目录
清理磁盘空间前的分析
检查是否有异常的大文件
只查看目录:du -sh */ | sort -rh | head
查看隐藏文件:du -sh .[!.]* * | sort -rh | head
指定目录:du -sh /path/to/directory/* | sort -rh | head
注意:在文件/目录数量很多的情况下可能会比较慢
这个命令是Linux系统管理员和开发人员常用的磁盘空间分析工具之一。
sort -rh 这里 反向 是什么意思,是数字大小反向 还是 字母顺充反向
在 sort -rh 命令中,-r(reverse)表示反向排序,这里的反向是针对数字大小的反向(从大到小排列),而不是字母顺序的反向。
-r 的作用:
默认情况下,sort 会按升序(从小到大)排列。
如果加入 -r,就会变成降序(从大到小)。
在 du 命令的输出中,数据通常是类似 1.5G, 500M, 100K 这样的"人类可读"大小,所以 -r 让它们按文件/目录大小从大往小排。
-h 的作用(human-readable sort):
错误的排序(默认字典序):10K > 2G(因为 1 < 2)
正确的排序(-h):2G > 10K
-h 让 sort 能智能识别 K、M、G 等单位,并按数值大小排序。
如果没有 -h,sort 会按照字符串字典序排序,导致 10K 排在 2G 前面(因为 1 的 ASCII 码小于 2),这显然不正确。
例如:
sort -rh = 按人类可读的大小数值降序排列(最大的在最前面)。
如果不是处理du的输出(比如要按字母反向排序),可以单独用 sort -r(例如 ls | sort -r 就是按文件名字母倒序)。
假设当前目录下有:
10K file1.txt
2G backup.tar
500M data.log
运行 du -sh * | sort -rh 会正确排序:
2G backup.tar
500M data.log
10K file1.txt
而如果只用 sort -r(不带 -h),可能会出现错误的字母排序,如 10K 排在了 2G 前面。
du -sh * | sort -rh 这里 sort 是对第一列排序吗
是的!在 du -sh * | sort -rh 这个命令中,sort 默认会对每一行的第一个字段(即文件/目录的大小)进行排序,但关键点在于 -h 参数会让排序逻辑正确识别人类可读的容量单位(K、M、G等)。
du -sh * 的输出格式:
每行通常由两部分组成,例如:
4.0K file1.txt
2.5G backup.tar
180M data.log
第一列是大小(默认是 sort 的排序依据),第二列是文件/目录名。
sort 的默认行为:
sort 默认以**行的第一个字段(空格/TAB分隔)**作为排序键。
如果不加 -h,它会按字典序(字母顺序)排序,导致 10K 排在 2G 前面(因为 1 < 2 字符),这显然不符合我们的预期。
-h 的作用:
-h(human-readable)让 sort 能智能识别数字+单位(如 K、M、G),并按实际数值排序:
bash2.5G backup.tar # 正确的最大值 180M data.log 4.0K file1.txt
此时 sort 依然以第一列为排序依据,但会解析它的数值而非字符串。
如果想确认 sort 究竟对哪一列排序,可以用 -k 参数指定列:
bashdu -sh * | sort -rh -k1 # 明确按第1列排序(大小) du -sh * | sort -rh -k2 # 按第2列排序(文件名,此时结果会混乱)
默认情况下 -k1 是省略的,所以 sort -rh 就是按第一列(大小)排序。
du -sh * | sort -rh 按第一列(人类可读的大小)降序排序。
-h 是关键,它让排序正确解析 K/M/G 等单位,避免字典序的误排。
du -sh * | sort -rh -k1 这里 -k1 ,,,k是什么缩写
这里的 -k 是 sort 命令参数的 key(键) 的缩写,用于指定排序的列或字段。
-k 的含义-k 代表 key(排序键),用于告诉 sort 应该按照哪一列(字段)进行排序。
语法:-k<起始列>[.<起始字符>,<终止列>[.<终止字符>]]
-k1 = 按第 1 列 排序(默认从该列第一个字符到行尾)
-k2,3 = 从第 2 列到第 3 列
-k3.5 = 从第 3 列的第 5 个字符开始
-k1 通常可以省略?sort 默认就是以第 1 列(-k1)排序,所以:
bashdu -sh * | sort -rh # 等价于按第 1 列(大小)排序 du -sh * | sort -rh -k1 # 显式指定按第 1 列排序
效果是一样的。
-k?当需要按非第一列排序时,必须用 -k 指定列。例如:
bash# 按文件名(第 2 列)排序,而不是大小 du -sh * | sort -k2 # 按文件名字母顺序 du -sh * | sort -k2 -r # 按文件名字母逆序
-k 用法如果数据有多个字段,可以用 -t 指定分隔符,再用 -k 选择列:
bash# 示例:对 /etc/passwd 按 UID(第 3 列)排序 awk -F: '{print $1,$3}' /etc/passwd | sort -k2 -n
(这里 -F: 表示用 : 分割字段)
| 参数 | 含义 | 示例 |
|---|---|---|
-k1 | 按第 1 列排序 | `du -sh * |
-k2 | 按第 2 列排序 | `du -sh * |
-k2.3 | 按第 2 列第 3 个字符排序 | `... |
-n | 按数字大小(而非字符串)排序 | `... |
在 du -sh * | sort -rh -k1 中,-k1 的作用是显式声明对第 1 列排序,但实际可以省略,因为 sort 默认就是按第 1 列排序。
sort 按数字排序 是 -n 吗? -n 是什么简写
在 sort 命令中,-n 用于 按数字(numeric)大小排序(而不是默认的字典序)。它的作用是强制让 sort 把字段解析为数值进行排序,而不是字符串。
-n 详解-n 是什么?
缩写代表 --numeric-sort(数值排序)。
例如:
bashecho -e "10\n2\n1" | sort # 默认字典序 → 1, 10, 2(错误的数字排序) echo -e "10\n2\n1" | sort -n # 数字排序 → 1, 2, 10
-n vs. -h
-n → 仅适用于纯数字(如 2024、123),不能解析 K、M、G 等单位。
-h → 适用于人类可读的数值(如 2K、1G),常用于 du 或 ls -lh 的输出。
常见用途
bash# 1. 对纯数字排序 echo -e "100\n20\n3" | sort -n # 输出:3, 20, 100 # 2. 对文件按行号排序 grep "error" log.txt | sort -n # 假设行号是数字 # 3. 结合 `-k` 对指定列按数字排序 awk '{print $3}' data.txt | sort -n
-n、-h、默认排序| 场景 | 示例数据 | 默认 sort | sort -n | sort -h |
|---|---|---|---|---|
| 纯数字 | 3\n10\n2 | 10, 2, 3 | 2, 3, 10 | 2, 3, 10 |
带单位(K、M) | 1K\n10M\n2G | 10M, 1K, 2G | 1K, 10M, 2G | 1K, 10M, 2G |
| 混合数字和字母 | a10\nb2\nc1 | a10, b2, c1 | a10, b2, c1 | a10, b2, c1 |
注意:
-h仅支持K/M/G/T等单位,对纯字母无效。
-n(numeric sort):仅对纯数字有效,强制按数值大小排序。
-h(human-readable sort):对 du -h 或 ls -lh 的输出(如 1K、2G)有效。
默认排序:按字典序(ASCII 码),可能导致 10 < 2。
使用建议:
bash# 处理数字时优先用 -n sort -n file.txt # 处理 `du` 或 `ls` 的输出时用 -h du -sh * | sort -rh
du -hsx * ,, du -sh * ,, du -h --max-depth=1 三个命令 详解 区别
这三个 du 命令都用于查看磁盘使用情况,但在统计范围、输出格式和递归深度上有重要区别。以下是详细对比:
du -hsx *命令解释:
-h:以人类可读格式显示(KB/MB/GB)
-s:仅显示汇总大小(不递归子目录细节)
-x:仅统计当前文件系统(跳过挂载点如 /mnt、NFS 等)
*:当前目录下的所有项目(不含隐藏文件)
输出特点:
每个文件/目录只显示一行总大小
跳过其他文件系统的内容(如挂载的磁盘)
不显示当前目录的汇总行
示例输出:
bash12K file.txt 50M Downloads 0 external_disk # 挂载点被忽略(由于 -x)
适用场景:
快速查看当前目录下各项目的大小,且明确排除外部挂载的存储。
du -sh *命令解释:
-sh:等同于 -h -s(人类可读+汇总模式)
无 -x 选项,故会统计所有挂载点
*:当前目录所有项目(不含隐藏文件)
输出特点:
每个文件/目录一行汇总大小
包含其他文件系统的内容(如挂载的磁盘/NFS)
不显示当前目录的汇总行
示例输出:
bash12K file.txt 50M Downloads 20G external_disk # 挂载点被统计
适用场景:
需要统计当前目录下所有内容(包括挂载点)的汇总大小。
du -h --max-depth=1命令解释:
-h:人类可读格式
--max-depth=1:仅显示当前目录和直接子项的占用(递归深度=1)
无 -x,会统计挂载点
无需 *,直接分析当前目录
输出特点:
显示当前目录的汇总行(.或目录名)
列出所有子项(文件和目录)的单独大小
比 -s 更详细,比默认递归更简洁
示例输出:
bash12K ./file.txt 50M ./Downloads 20G ./external_disk 20G . # 当前目录总大小
适用场景:
需同时查看当前目录总大小和直接子项的占用情况。
| 特性 | du -hsx * | du -sh * | du -h --max-depth=1 |
|---|---|---|---|
| 显示格式 | 仅汇总大小 | 仅汇总大小 | 子项细节 + 当前目录汇总 |
| 递归深度 | 无递归(仅汇总) | 无递归(仅汇总) | 深度=1(直接子项) |
| 是否跨文件系统 | ❌ 跳过挂载点(-x) | ✔️ 统计挂载点 | ✔️ 统计挂载点 |
| 隐藏文件 | 不统计 | 不统计 | 可通过 .* 扩展统计 |
快速检查目录大小(排除挂载点) → du -hsx *
统计所有内容(含挂载点) → du -sh *
分析当前目录结构 → du -h --max-depth=1
附加技巧:
若要包含隐藏文件,改用 du -hsx .[!.]* * 或 du -h --max-depth=1 .
在大型目录中,--max-depth 比无限制递归更高效。
快速查看目录大小:用 du -hs * 或 du -sh *(简洁)。
分析目录结构:用 du -h --max-depth=1(更详细,含汇总)。
统计当前目录总大小:du -sh .(仅汇总当前目录)。
注意:如果目录中有大量文件,* 可能会触发“参数列表过长”错误,此时建议改用:
bashfind . -maxdepth 1 -exec du -hs {} \;
-s 是什么简写
在 du 命令中,-s 是 --summarize 的简写,表示 仅显示总占用空间,不列出子目录或文件的详细内容。
避免递归输出:默认 du 会递归显示所有子目录的磁盘使用情况,而 -s 只输出当前目录或文件的总大小。
简洁高效:适合快速查看目录汇总大小,无需关心内部细节。
-s 的情况(默认递归输出)bashdu -h dir
输出可能为:
4K dir/subdir1/file1
8K dir/subdir1
12K dir/subdir2
24K dir # 总大小
-s(仅汇总)bashdu -sh dir
输出仅一行:
24K dir
du -sh *:查看当前目录下所有文件和目录的总大小(不递归)。
du -sh /path/to/dir:快速统计某个目录的总磁盘用量。
注意:
-s 和 --max-depth=0 效果类似,但 -s 是更简洁的写法。
在需要同时显示人类可读格式(如 KB/MB)时,常与 -h 结合使用(-sh)。
如果还有其他疑问,欢迎继续提问!
du -hsx * 中 -x 是什么简写
在 du -hsx * 命令中,-x 是 --one-file-system 的简写,表示 仅统计当前文件系统的磁盘使用情况,忽略其他挂载点(如 NFS、外接硬盘等)。
-x 的具体作用防止跨文件系统统计:
默认情况下,du 会递归遍历所有子目录,包括挂载的其他文件系统(例如 /mnt、/media 下的外接硬盘或网络存储)。
使用 -x 后,du 会限制在 当前文件系统(即命令执行目录所在的文件系统),跳过其他挂载点。
避免重复或无效统计:
如果目录中挂载了其他磁盘(如 /data 是独立分区),-x 可以避免统计这些外部存储的数据,仅计算当前分区的真实使用量。
假设当前目录 /home 下挂载了一个外部磁盘到 /home/external:
bash# 不使用 -x(会统计所有挂载点) du -hs *
可能输出:
10G /home/user
20G /home/external # 外部磁盘被统计
bash# 使用 -x(仅统计当前文件系统) du -hsx *
输出:
10G /home/user
0 /home/external # 外部磁盘被忽略
统计系统根目录的真实用量(忽略 /proc、/sys 等虚拟文件系统和其他挂载点):
bashdu -hsx /
精确计算某个分区的空间占用:
bashdu -hsx /var # 仅统计 /var 所在分区的数据
-s 和 -h 的关系-s(--summarize):仅显示汇总大小。
-h(--human-readable):以易读单位(KB/MB/GB)显示。
-x(--one-file-system):限制在当前文件系统。
三者的组合 -hsx 是一种高效且精准的磁盘统计方式。
如果需要统计所有文件系统(包括挂载点),则不要使用 -x。
在脚本中,-x 可以提高效率,避免扫描无关的挂载目录(如 Docker 卷、NFS 等)。
如果还有其他疑问,欢迎继续提问!