如何获取目录及其子目录的摘要大小?


307

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

如果使用,df我会得到每个已挂载文件系统的大小,但这也无济于事。然后,du我得到了每个子目录的大小以及整个文件系统的摘要。

但是我只希望文件系统的ROOT文件夹中每个目录的摘要大小。有什么命令可以做到这一点吗?


--total标志是对我有帮助。例如du -sh --total applications/*askubuntu.com/a/465436/48214
瑞安

Answers:


433

这就是您要寻找的:

du -sh /*

这意味着什么:

  • -s 仅给出每个命令行参数的总数。
  • -h用于易于理解的后缀,例如M兆字节和G千兆字节(可选)。
  • /*只需扩展到中的所有目录(和文件)/

    注意:不包含点文件;跑shopt -s dotglob也包括那些。

按大小排序也很有用:

du -sh /* | sort -h

这里:

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

8
如果根目录中有点目录,则可以shopt -s dotglob用来将它们包括在计数中。
菲利普

8
这非常有用,因为它很简单,您可以放置​​所需的路径而不是/*,例如./对于当前目录或当前目录./*中的每个项目。
psur

3
@psur或您可以./*/用来仅获取子文件夹,而不是所有项目
relascope

7
排序后的版本:du -sh /* | sort -h
Vu Anh

2
@ c1phr如果您sort没有@ c1phr -h,则还需要将其保留du,否则排序将混合成千/兆/兆字节。du -s /* | sort -nr
托马斯

79

我经常需要找到最大的目录,因此要获得包含20个最大目录的排序列表,请执行以下操作:

du -m /some/path | sort -nr | head -n 20

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


11
这是使它更具可读性的方法du -sh / some / path | -hr | 头-n 20
Xedecimal

6
@Xedecima使用h的问题是排序不知道如何处理不同的大小。例如,将268K排序为高于255M,而将两者都排序为高于2.7G
chrisan 2013年

4
“ sort”命令上的-h(人类可读)参数应正确读取这些值。就像du的-h标志导出它们一样。我猜取决于您的运行情况。
Xedecimal

在Ubuntu 16.04中工作。不错的提示。
SDsolar

sudo du -haxt 1G / | -hr | 头-30
异常


11

现有的答案非常有帮助,也许有些初学者(例如我)也会发现此帮助。

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

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

    du -sh ./*
    

for each不起作用,因为它将控制台字符(例如\033[)添加到文件夹列表中
machineaddict

@machineaddict不确定您的意思。我一直都用这个,对我来说很好。
马丁

尝试以开头的命令运行for each。它将无法正常工作
machineaddict

我完全按照此处的命令运行命令。从每个开始。作品。
马丁

7

以下du调用应在BSD系统上起作用:

du -d 1 /

1
我的du(Ubuntu 10.4)没有-d选择。您在什么系统上?
托马斯(Thomas)

在我的openSUSE上,它也没有-d选项:(
2ndkauboy 2010年

好的,那只是BSD选项(我在OS X上)。
菲利普

BSD / * NIX上正确的可移植选项组合为du -sk /*。我非常讨厌这些-k东西。Linux -h完全是一团糟。
Dummy00001 2010年

在其他系统中,其--max-depth
Vishnu Kumar

4

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

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

du -h | sort -h

这会将您埋入大量的小文件中。您可以通过以下方法摆脱它们--threshold:(在我的示例中为1 MB):

du --threshold=1M -h | sort -h

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

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

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

1
--threshold ^^^在Linux上不可用此选项
podarok

1
@podarok在OpenSUSE 13.2 Linux上可用。尝试查找发行版的最新版本,或者自己编译软件包的最新版本。
亚伦·迪古拉

它在Ubuntu LTS(14.04)上不起作用。这是最近的一个)))
podarok

@podarok哪个版本的GNU coreutils?我的是8.24。
亚伦·迪古拉

1
缓存可能是一个不好的名词。我想到的是在此端口superuser.com/a/597173/121352中完成的操作,在该端口中,我们将磁盘内容扫描一次到映射中,然后继续使用该映射中的数据,而不是再次击中磁盘。
Hennes

1

请注意,您无法du在没有确定的情况下将目录与不同系统/机器上的目录进行比较,因为它们都共享文件系统的相同块大小。如果您将某些文件从linux计算机同步到nas,并且想自己比较已同步的目录,则这可能很重要。du由于块大小不同,您可能会得到不同的结果。


0

您可能还想签出xdiskusage。将为您提供相同的信息,但以图形方式显示,并允许进行深入分析(非常有用)。对于KDE甚至Windows,还有其他类似的实用程序。


0

您可以ls结合使用awk

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

的输出通过ls管道传递到awkawk开始处理数据。标准分隔符是空格。总和变量tot初始化为零;对于所输出的每一行/每一行执行以下语句ls。它只是tot随着大小而增加。$5代表第五列(由输出ls)。最后,我们除以(1024 * 1024)以总和为兆字节。

如果要将其转换为脚本或函数(.bashrc),则还可以根据文件类型使用它来获取某些目录子集的大小。

如果您需要系统范围的信息,kdirstat可能会派上用场!


我同意可以扩展此示例并执行一些技巧,例如获得“根据文件类型确定目录的某些子集”的大小等。这似乎是一个很好的起点。然而,这种解决方案从一开始就存在缺陷。对于每个想要使用此方法的用户,我建议阅读该问题的答案和评论以及其中的链接文章。我不是说你根本做不到。知道局限性,仅此而已。
卡米尔Maciorowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.