如何在 Bash 中列出每个文件和目录的大小并按大小降序排序?

我发现在 Bash 中没有容易获得目录大小的方法?

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

这可能吗?

204166 次浏览

ls -S按大小排序。然后,为了显示大小,ls -lS给出了一个长(-l) ,按大小(-S)排序显示。我通常也会加上 -h,让东西更容易阅读,所以,ls -lhS

du -s -- * | sort -n

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

使用 du -sm的 Mb 单位等,我总是使用

du -smc -- * | sort -n

因为总线(-c)最终会出现在底部,原因显而易见:)

附注:

  • 请参阅处理 dotfiles 的注释
  • 我经常使用例如“ du-smc/home// | sort-n | tail”来感觉大数据位的确切位置

I think I might have figured out what you want to do. This will give a sorted list of all the files and all the directories, sorted by file size and size of the content in the directories.

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

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

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 box 目前的文件数量)进行了测试,我相信这是一个惊人的结果:

# 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) ,也就是以字节为单位的文件大小被采用,然后再次通过管道传送到 xargsxargs再次生成一行由空格分隔的大小。现在使用 sed 魔术,用一个加号(+)替换每个空格,最后由 bc(基本计算器)计算。

它可能需要额外的调优,而且您可能有 ls命令抱怨参数列表太长。

另一个简单的解决办法。

$ 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”将显示人类可读的大小,但我们不能用这种方法进行排序。

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

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

OR add-h 表示人类可读的大小,-r 表示首先打印更大的目录/文件。

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

命令

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 displays "disk usage"
  • h表示“人类可读性”(同时使用 sort 和 du 表示)
  • max-depth=0 means du will not show sizes of subfolders (remove that if you want to show all sizes of every file in every sub-, subsub-, ..., folder)
  • r表示“反向”(首先是最大的文件)

NCDU

When I came to this question, I wanted to clean up my file system. The command line tool ncdu is way better suited to this task.

在 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 -h | sort -hr | more 或者 Du-h —— max-deep = 0 * | sort-hr | more

我倾向于用一种简单的方式来使用 du。

du -sh */ | sort -n

这为我提供了哪些目录正在消耗最大的空间的想法。之后我可以进行更精确的搜索。

显然,在 MacOSX 版本的 du命令中没有 --max-depth选项。

du -h -d 1 | sort -n

简单快捷:

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

* 要求 GNU Parallel

sudo du -hsx 2>/dev/null * | sort -hr | less

4.9G    var
2.2G    usr
61M     root
9.0M    etc
6.5M    home
824K    init
36K     run
16K     lost+found
4.0K    tmp
4.0K    srv
4.0K    opt
4.0K    mnt
4.0K    media
4.0K    boot
0       sys
0       sbin
0       proc
0       libx32
0       lib64
0       lib32
0       lib
0       dev
0       bin
(END)