du 只查看目录并按大小排序

du to just look at directories and sort by size

关于这个的话题很长,我已经阅读了我能找到的所有内容,但他们没有回答我的问题。

以下是我能找到的在文件夹中获得格式良好的 du 列表的最佳方法:

du -hsc $(ls -A) | sort -h

但是,这并不是我想要的,因为我希望它过滤掉/不显示顶级文件夹中的文件。我只想获得目录(包括 .* 目录)的摘要,而不是单个文件的混乱。我想我需要修改 ls 但不知道如何修改?

更好的方法是执行上述操作,并且另外显示一行仅显示此文件夹顶层中所有文件的总大小,如果可能的话,与所有子文件夹总数一起显示?

(大部分)从评论中重复:

您可以只在 ls 中使用 -F,然后过滤掉不以 / 结尾的行。例如 du -hsc $(ls -AF) | sort -h | sed '\@/$@!d'

这将删除总数,您可以通过以下方式轻松取回:

du -hsc $(ls -AF) | sort -h | sed '$p; \@/$@!d'

不解析 ls 的输出,这是一个糟糕的选择:

printf %s\n .[^.]*/ ..[^.]/ ..[^.]*/ */ |
  xargs du -hsc 2>/dev/null |
    sort -k1h

如果您需要支持包含换行符或特殊字符的目录名称:

printf %s\0 .[^.]*/ ..[^.]/ ..[^.]*/ */ |
  xargs -0 du -hsc0 2>/dev/null |
    sort -zk1h |
      xargs -0l

我不明白你为什么要在这里使用 ls。一个简单的

old_setting=$(shopt -p dotglob)
shopt -s dotglob
du -hsc */
eval $old_setting

就足够了。终止斜线很重要,因为这指示 bash 仅创建目录名称,并且您需要设置 dotglob 以包含点目录(...).在我的代码中,我还小心地保存了旧的 dotglob 设置并在其他情况下恢复它。只有当您的代码是大型脚本的一部分时才需要这样做,其中某些部分可能依赖于 dotglob.

的默认值

旁注:一种完全不同的方法是为您的脚本选择 zsh 而不是 bash。在 zsh 中,您不需要更改任何选项,而只需在模式本身中表达您想要 glob 点目录:

du -hsc */(D)  # This is for zsh only!