【问题标题】:How to list the size of each file and directory and sort by descending size in Bash?如何在 Bash 中列出每个文件和目录的大小并按大小降序排序?
【发布时间】:2011-11-19 18:48:53
【问题描述】:

我发现在 Bash 中很难获得目录的大小?

我希望当我输入ls -<some options>时,它可以同时列出所有目录的文件大小和文件大小的总和,并按大小顺序排序。

这可能吗?

【问题讨论】:

  • 目录的“大小”到底是什么意思?它下的文件数(递归与否)?它下的文件大小的总和(递归与否)?目录本身的磁盘大小? (目录被实现为包含文件名和其他信息的特殊文件。)
  • 应该是递归下的文件大小的总和
  • @Kit:那么du就是答案。
  • @KeithThompson @KitHo du 命令估计文件空间使用情况,因此如果您想获得确切大小,则无法使用它。
  • @ztank1013:根据您所说的“确切大小”,du(至少是 GNU coreutils 版本)可能有提供信息的选项。

标签: linux file bash


【解决方案1】:
du -s -- * | sort -n

(这不会显示隐藏的(.dotfiles)文件)

du -sm 用于 Mb 单位等。我总是使用

du -smc -- * | sort -n

因为出于显而易见的原因,总行 (-c) 最终会排在底部 :)

PS:

  • 查看 cmets 处理点文件
  • 我经常使用例如'du -smc /home// | sort -n |tail' 以了解大块的确切位置

【讨论】:

  • du --max-depth=1|sort -nfind . -mindepth 1 -maxdepth 1|xargs du -s|sort -n 也包括点文件。
  • @arnoud:我也使用它,但对于这个问题(/答案)来说,它似乎不是正确的添加:)
  • @arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -n 如果找到的某些路径可能包含空格。
  • 这是一个很好的变体,可以获得最大的人类可读视图:sudo du -smch * | sort -h | tail
【解决方案2】:

命令

du -h --max-depth=0 * | sort -hr

输出

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

说明

  • du 显示“磁盘使用情况”
  • h 用于“人类可读”(包括排序和杜)
  • max-depth=0 表示 du 不会显示子文件夹的大小(如果您想显示每个子文件夹、子文件夹、...、文件夹中每个文件的所有大小,请删除它)
  • r 用于“反向”(最大文件优先)

ncdu

当我提出这个问题时,我想清理我的文件系统。命令行工具ncdu 更适合这项任务。

在 Ubuntu 上安装:

$ sudo apt-get install ncdu

用法:

只需在命令行中输入ncdu [path]。分析路径几秒钟后,您将看到如下内容:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

d 删除当前突出显示的元素,用 CTRL + c

退出

【讨论】:

  • 你也可以写 du -hs * |排序-hr。 -s (summarize) 等同于 --max-depth=0
【解决方案3】:

简单快速:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

*需要GNU Parallel

【讨论】:

    【解决方案4】:

    显然--max-depth 选项不在Mac OS X 的du 命令版本中。您可以改用以下内容。

    du -h -d 1 | sort -n

    【讨论】:

    • 显然,但并不奇怪。
    • 不幸的是,这不显示文件,而只显示文件夹大小。 -a 也不适用于 -d
    • 为了显示文件和文件夹,我结合了 2 个命令:l -hp | grep -v / && du -h -d 1,它从 ls 显示文件的正常文件大小,但对目录使用 du
    【解决方案5】:

    我倾向于以简单的方式使用 du。

    du -sh */ | sort -n
    

    这让我了解哪些目录占用的空间最多。然后我可以稍后运行更精确的搜索。

    【讨论】:

    • 这种工作,但在排序时忽略了文件大小上的单位。
    【解决方案6】:

    只需导航到目录并运行以下命令:

    du -a --max-depth=1 | sort -n
    

    或添加 -h 以获取人类可读的大小,并添加 -r 以首先打印更大的目录/文件。

    du -a -h --max-depth=1 | sort -hr
    

    【讨论】:

    • du -h 也需要sort -h,以确保981M 排在1.3G 之前;使用 sort -n 时,只会考虑数字,而且它们的方式是错误的。
    • 这不会列出当前目录中单个文件的大小,只列出其子目录的大小和当前目录的总大小。您将如何在输出中包含单个文件(以回答 OP 的问题)?
    • @ErikTrautman 列出文件还需要添加 -a 并使用 --all 而不是 --max-depth=1 像这样 du -a -h --all | sort -h
    • 太棒了!几年来我一直在做一些事情。 :)
    • sort -h 仅适用于 GNU 版本 / Linux,不适用于 BSD / OS X。
    【解决方案7】:

    您可以使用以下按大小列出文件 杜-h |排序-hr |更多的 要么 杜 -h --max-depth=0 * |排序-hr |更多

    【讨论】:

      【解决方案8】:

      另一个简单的解决方案。

      $ for entry in $(ls); do du -s "$entry"; done | sort -n
      

      结果会是这样的

      2900    tmp
      6781    boot
      8428    bin
      24932   lib64
      34436   sbin
      90084   var
      106676  etc
      125216  lib
      3313136 usr
      4828700 opt
      

      将“du -s”更改为“du -sh”将显示人类可读的大小,但我们将无法在此方法中进行排序。

      【讨论】:

        【解决方案9】:

        [增强版]
        这将比下面的初始版本更快更精确,并将输出当前目录所有文件大小的总和:

        echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
        

        文件上的stat -c %s 命令将返回其大小(以字节为单位)。这里的tr 命令用于克服xargs 命令的限制(显然管道到xargs 将结果拆分为更多行,破坏了我的命令的逻辑)。因此tr 负责用+(加号)替换换行符。 sed 的唯一目标是从结果字符串中删除最后一个 + 符号,以避免来自最终的 bc(基本计算器)命令的抱怨,该命令像往常一样进行数学运算。

        性能:我在几个目录和超过 150.000 个文件顶部(我的 Fedora 15 盒子的当前文件数量)上测试了它,我认为这是一个惊人的结果:

        # time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
        12671767700
        
        real    2m19.164s
        user    0m2.039s
        sys 0m14.850s
        

        如果您想与du -sb / 命令进行比较,它将以字节为单位输出估计的磁盘使用情况(-b 选项)

        # du -sb /
        12684646920 /
        

        正如我所料,它比我的命令计算要大一些,因为du 实用程序返回每个文件的分配空间,而不是实际消耗的空间。

        [初始版本]
        如果您需要知道文件夹的确切总大小,则不能使用 du 命令,因为(根据手册页引用)du 估计文件空间使用情况。因此,它会导致您得出错误的结果,即近似值(可能接近总和大小,但很可能大于您正在寻找的实际大小)。

        我认为可能有不同的方式来回答您的问题,但这是我的问题:

        ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc
        

        它会在 .目录(更改 . 使用您喜欢的任何目录),还包括隐藏文件,并且(使用 xargs)在一行中输出它们的名称,然后使用 ls -l 生成详细列表。这个(有时)巨大的输出被传送到 cut 命令,并且只有第五个字段(-f5),它是文件大小(以字节为单位),并再次通过管道传送到xargs,这再次产生一行由空格分隔的大小。现在执行一个 sed 魔术,用加号 (+) 替换每个空格,最后 bc(基本计算器)进行数学运算。

        它可能需要额外的调整,你可能有 ls 命令抱怨参数列表太长。

        【讨论】:

        • 如果目录太大,挂了很久,尝试在你的主目录下工作:p
        • @KitHo 好吧,如果不搜索每个文件并添加其大小,恐怕没有简单快捷的方法来获得精确的结果,因此命令惰性主要取决于搜索下的文件数量目录...但我相信还有改进的余地...不错的挑战!
        • @KitHo 嘿,看看我的回答中的增强版...当然让我知道!
        【解决方案10】:

        我想我可能已经知道你想做什么了。这将给出所有文件和所有目录的排序列表,按文件大小和目录中内容的大小排序。

        (find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
        

        【讨论】:

        • 没关系,sehe 提出了一个更简单的解决方案。我每天都能学到新东西!
        • 我不认为使用du 是一种选择,它会给你一个大概的结果。
        【解决方案11】:

        ls -S 按大小排序。然后,为了也显示大小,ls -lS 给出了一个 long (-l),按大小 (-S) 排序显示。我通常也会添加-h,以使内容更易于阅读,所以,ls -lhS

        【讨论】:

        • 啊,抱歉,您的帖子并不清楚。你想要du,好像有人发了。 @sehe:取决于您对真实的定义——它显示了目录用于存储自身的空间量。 (它只是不增加子条目的大小。)它不是随机数,也不总是 4KiB。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 2015-04-07
        • 1970-01-01
        • 2014-03-11
        • 1970-01-01
        • 2021-08-02
        相关资源
        最近更新 更多