AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 62411
Accepted
Tom Feiner
Tom Feiner
Asked: 2009-02-26 05:42:42 +0800 CST2009-02-26 05:42:42 +0800 CST 2009-02-26 05:42:42 +0800 CST

如何按大小对 du -h 输出进行排序

  • 772

我需要获取人类可读的 du 输出列表。

但是,du没有“按大小排序”选项,并且管道sort不适用于人类可读的标志。

例如,运行:

du | sort -n -r 

按大小(降序)输出排序的磁盘使用情况:

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

但是,使用人类可读标志运行它时,无法正确排序:

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

有人知道du -h 按大小排序的方法吗?

linux bash du gnu
  • 30 30 个回答
  • 1001294 Views

30 个回答

  • Voted
  1. Best Answer
    ptman
    2010-07-02T04:29:56+08:002010-07-02T04:29:56+08:00

    从2009 年 8 月发布的GNU coreutils 7.5sort开始,允许使用一个-h参数,该参数允许以下类型的数字后缀du -h:

    du -hs * | sort -h
    

    如果您使用的是不支持的排序-h,您可以安装 GNU Coreutils。例如在较旧的 Mac OS X 上:

    brew install coreutils
    du -hs * | gsort -h
    

    从sort 手册:

    -h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)

    • 1893
  2. cadrian
    2009-02-26T05:52:03+08:002009-02-26T05:52:03+08:00
    du | sort -nr | cut -f2- | xargs du -hs
    
    • 105
  3. neutral
    2009-02-26T12:39:28+08:002009-02-26T12:39:28+08:00

    我使用了一个非常有用的工具,称为ncdu,它旨在查找那些讨厌的高磁盘使用率文件夹和文件,并删除它们。它是基于控制台的、快速而轻便的,并且在所有主要发行版上都有包。

    • 79
  4. Adam Bellaire
    2009-02-26T13:04:55+08:002009-02-26T13:04:55+08:00

    @Douglas Leeder,还有一个答案:使用另一种工具对 du -h 的人类可读输出进行排序。像 Perl!

    du -h | perl -e 'sub h{%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
    return $n*2**$h{$u}}print sort{h($b)<=>h($a)}<>;'
    

    分成两行以适合显示。您可以以这种方式使用它,也可以将其设为单线,无论哪种方式都可以。

    输出:

    4.5M    .
    3.7M    ./colors
    372K    ./plugin
    128K    ./autoload
    100K    ./doc
    100K    ./syntax
    

    编辑:在PerlMonks打了几轮高尔夫球后,最终结果如下:

    perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'
    
    • 70
  5. chrisharris.
    2009-02-26T06:01:36+08:002009-02-26T06:01:36+08:00
    du -k * | sort -nr | cut -f2 | xargs -d '\n' du -sh
    
    • 47
  6. Douglas Leeder
    2009-02-26T05:53:52+08:002009-02-26T05:53:52+08:00

    据我所知,您有三个选择:

    1. 在显示前更改du排序。
    2. 更改sort以支持数字排序的人体尺寸。
    3. 后处理 sort 的输出以将基本输出更改为人类可读的。

    您也可以du -k使用 KiB 中的大小。

    对于选项 3,您可以使用以下脚本:

    #!/usr/bin/env python
    
    import sys
    import re
    
    sizeRe = re.compile(r"^(\d+)(.*)$")
    
    for line in sys.stdin.readlines():
        mo = sizeRe.match(line)
        if mo:
            size = int(mo.group(1))
            if size < 1024:
                size = str(size)+"K"
            elif size < 1024 ** 2:
                size = str(size/1024)+"M"
            else:
                size = str(size/(1024 ** 2))+"G"
    
            print "%s%s"%(size,mo.group(2))
        else:
            print line
    
    • 24
  7. Joachim Sauer
    2009-02-26T05:56:15+08:002009-02-26T05:56:15+08:00

    我也遇到过这个问题,我目前正在使用一种解决方法:

    du -scBM | sort -n
    

    这不会产生缩放值,但总是产生以兆字节为单位的大小。这还不够完美,但对我来说总比没有好(或以字节为单位显示大小)。

    • 24
  8. Adam Bellaire
    2009-02-26T06:09:00+08:002009-02-26T06:09:00+08:00

    在别处找到这个帖子。因此,这个 shell 脚本会做你想做du的事,而不需要调用两次。它用于awk将原始字节转换为人类可读的格式。当然,格式略有不同(所有内容都打印到小数点后一位)。

    #/bin/bash
    du -B1 | sort -nr  |awk '{sum=$1;
    hum[1024**3]="G";hum[1024**2]="M";hum[1024]="K";
    for (x=1024**3; x>=1024; x/=1024){
            if (sum>=x) { printf "%.1f%s\t\t",sum/x,hum[x];print $2;break
    }}}'
    

    在我的.vim目录中运行它会产生:

    4.4M            .
    3.6M            ./colors
    372.0K          ./plugin
    128.0K          ./autoload
    100.0K          ./syntax
    100.0K          ./doc
    

    (我希望 3.6M 的配色方案不会过多。)

    • 21
  9. slm
    2011-08-11T19:08:18+08:002011-08-11T19:08:18+08:00

    这是一个以更紧凑的汇总形式显示目录的示例。它处理目录/文件名中的空格。

    % du -s * | sort -rn | cut -f2- | xargs -d "\n" du -sh
    
    53G  projects
    21G  Desktop
    7.2G VirtualBox VMs
    3.7G db
    3.3G SparkleShare
    2.2G Dropbox
    272M apps
    47M  incoming
    14M  bin
    5.7M rpmbuild
    68K  vimdir.tgz
    
    • 20
  10. Dennis Williamson
    2009-09-05T09:06:55+08:002009-09-05T09:06:55+08:00

    此版本用于awk为排序键创建额外的列。它只调用du一次。输出应该看起来完全像du.

    我把它分成了多行,但它可以重新组合成一行。

    du -h |
      awk '{printf "%s %08.2f\t%s\n", 
        index("KMG", substr($1, length($1))),
        substr($1, 0, length($1)-1), $0}' |
      sort -r | cut -f2,3
    

    解释:

    • BEGIN - 创建一个要索引的字符串,用 1、2、3 代替 K、M、G 以按单位分组,如果没有单位(大小小于 1K),则不匹配并返回零(完美! )
    • 打印新字段 - 单位、值(以使 alpha 排序正常工作,它是零填充、固定长度)和原始行
    • 索引大小字段的最后一个字符
    • 拉出尺寸的数字部分
    • 对结果进行排序,丢弃多余的列

    在没有命令的情况下尝试它cut,看看它在做什么。

    这是一个在 AWK 脚本中进行排序的版本,不需要cut:

    du -h |
       awk '{idx = sprintf("%s %08.2f %s", 
             index("KMG", substr($1, length($1))),
             substr($1, 0, length($1)-1), $0);
             lines[idx] = $0}
        END {c = asorti(lines, sorted);
             for (i = c; i >= 1; i--)
               print lines[sorted[i]]}'
    
    • 20

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve