欢迎各位兄弟 发布技术文章
这里的技术是共享的
指定目录: 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 等)。
如果还有其他疑问,欢迎继续提问!