如何获取目录及其子目录的汇总大小?

2nd*_*boy 350 linux unix console

假设我想获取 Linux 文件系统的每个目录的大小。当我使用时,ls -la我并没有真正获得文件夹的汇总大小。

如果我使用,df我会得到每个已安装文件系统的大小,但这也无济于事。并通过du我获得每个子目录的大小和整个文件系统的摘要。

但我只想拥有文件系统的 ROOT 文件夹中每个目录的汇总大小。有什么命令可以实现吗?

Tho*_*mas 508

这就是你要找的:

du -sh /*
Run Code Online (Sandbox Code Playgroud)

这是什么意思:

  • -s 只给出每个命令行参数的总数。
  • -h用于人类可读的后缀,如M兆字节和G千兆字节(可选)。
  • /*简单地扩展到/.

    注意:不包括点文件;运行shopt -s dotglob以包括这些。

按大小排序也很有用:

du -sh /* | sort -h
Run Code Online (Sandbox Code Playgroud)

这里:

  • -h确保sort正确解释人类可读的后缀。

  • 它非常有用,因为它很简单,你可以放置你想要的路径而不是`/*`,例如`./` 表示当前目录或`./*` 表示当前目录中的每个项目。 (10认同)
  • 如果根目录中有点目录,则可以使用 `shopt -s dotglob` 将它们包括在计数中。 (9认同)
  • 排序版本:`du -sh /* | 排序-h` (9认同)
  • @psur 或者你可以使用 `./*/` 来只获取子文件夹而不是所有项目 (4认同)
  • @c1phr 如果你的 `sort` 没有 `-h`,你也需要将它从 `du` 中删除,否则排序会混淆千/兆/千兆字节。`du -s /* | 排序-nr`。 (3认同)

Jan*_*nen 88

我经常需要找到最大的目录,所以为了得到一个包含 20 个最大目录的排序列表,我这样做:

du -m /some/path | sort -nr | head -n 20
Run Code Online (Sandbox Code Playgroud)

在这种情况下,大小将以兆字节报告。

  • 这是一种使其更具可读性的方法 du -sh /some/path | 排序 -hr | 头-n 20 (15认同)
  • @Xedecima 使用 h 的问题是排序不知道如何处理不同的大小。比如268K排序高于255M,都排序高于2.7G (7认同)
  • 'sort' 命令上的 -h(人类可读)参数应该正确读取这些值。就像 du 的 -h 标志导出它们一样。我猜这取决于你在跑什么。 (5认同)
  • 须藤杜-haxt 1G / | 排序 -hr | 头-30 (2认同)

小智 27

我喜欢使用Ncdu,你可以使用光标来导航和深入浏览它工作得非常好的目录结构。


Mar*_*tin 14

现有的答案非常有帮助,也许一些初学者(像我一样)也会觉得这很有帮助。

  1. 非常基本的循环,但对我来说,这是其他一些与大小相关的操作的良好开端:

    for each in $(ls) ; do du -hs "$each" ; done
    
    Run Code Online (Sandbox Code Playgroud)
  2. 与第一个答案非常相似,结果与 1.) 几乎相同,但我花了一些时间来理解 * 与 ./* 如果在子目录中的区别:

    du -sh ./*
    
    Run Code Online (Sandbox Code Playgroud)


Phi*_*ipp 9

以下du调用应该适用于 BSD 系统:

du -d 1 /
Run Code Online (Sandbox Code Playgroud)

  • 我的 `du`(Ubuntu 10.4)没有 `-d` 选项。你是什​​么系统? (2认同)

Aar*_*lla 5

这并不容易。该du命令要么显示文件和文件夹(默认),要么只显示您在命令行中指定的所有项目的大小(选项-s)。

要在 Linux 上以人类可读的大小获取最大的项目(文件和文件夹),排序,请执行以下操作:

du -h | sort -h
Run Code Online (Sandbox Code Playgroud)

这会让你陷入大量的小文件中。您可以使用--threshold(在我的示例中为 1 MB)来摆脱它们:

du --threshold=1M -h | sort -h
Run Code Online (Sandbox Code Playgroud)

此命令的优点是它包含隐藏的点文件夹(以 开头的文件夹.)。

如果您真的只想要文件夹,则需要使用,find但这可能会非常非常慢,因为du必须多次扫描许多文件夹:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h
Run Code Online (Sandbox Code Playgroud)

  • --threshold ^^^ 这个选项在 linux 上不可用 (2认同)
  • @podarok 它在 OpenSUSE 13.2 Linux 上可用。尝试找到更新版本的发行版或自己编译更新版本的软件包。 (2认同)
  • 缓存可能是一个糟糕的术语。我正在考虑在此端口 http://superuser.com/a/597173/121352 中完成的操作,我们将磁盘内容一次扫描到映射中,然后继续使用该映射中的数据,而不是再次访问磁盘。 (2认同)