解决git-bash中du -h输出含小数的大小排序异常问题
解决Git Bash中
du -h输出按大小排序时小数异常的问题 Git Bash中出现这种排序异常,核心原因是sort默认的区域设置可能无法正确识别以点(.)作为分隔符的小数,或者部分版本的sort对-h选项处理带小数的单位值存在兼容问题,导致把7.8G和74G当成字符串排序,而非按实际字节大小排序。以下是几个可靠的解决方法:
方法1:先按字节数排序,再转换为人类可读格式(最可靠)
绕开sort -h的小数兼容问题,直接用原始字节数排序,再转成易读格式,结果绝对准确:
du -b /path | sort -nr | numfmt --to=iec-i --suffix=B --padding=7
du -b:输出每个文件/目录的字节数(而非人类可读格式)sort -nr:按数字降序排序(n表示数字排序,r表示反向)numfmt:将字节数转换为带单位的人类可读格式,--to=iec-i使用1024进制(KiB/ MiB/ GiB等),--suffix=B添加单位后缀,--padding=7让输出对齐更美观
方法2:强制设置sort使用C区域
临时将区域设置改为C,让sort正确识别点作为小数分隔符:
du -h /path | LC_ALL=C sort -hr
LC_ALL=C:强制命令使用POSIX标准的C区域设置,确保小数解析逻辑统一,避免区域差异导致的识别错误sort -hr:h表示按人类可读的大小排序,r表示降序
方法3:用awk手动解析大小并排序(兼容极端场景)
如果前两种方法都无效,可以用awk手动将所有大小转换为字节数,排序后再还原输出:
du -h /path | awk '{ size = $1 sub(/[KMGTP]/, "", size) unit = substr($1, length($1)) # 转换为字节数 if (unit == "K") size *= 1024 else if (unit == "M") size *= 1024^2 else if (unit == "G") size *= 1024^3 else if (unit == "T") size *= 1024^4 else if (unit == "P") size *= 1024^5 print size "\t" $0 }' | sort -nr | cut -f2-
- awk部分:提取大小数值和单位,转换为字节数,将字节数和原始行用制表符分隔输出
sort -nr:按字节数降序排序cut -f2-:去掉前面的字节数字段,输出原始的size path格式
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

