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

时间:2011-09-18 18:37:42

标签: linux file bash

我发现Bash中的目录大小并不容易?

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

这可能吗?

11 个答案:

答案 0 :(得分:202)

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

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

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

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

答案 1 :(得分:18)

du -s -- * | sort -n

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

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

du -smc -- * | sort -n

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

PS:

  • 查看有关处理dotfiles的评论
  • 我经常使用例如'du -smc / home / / |排序-n | tail'以了解大比特的位置

答案 2 :(得分:15)

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

du -h -d 1 | sort -n

答案 3 :(得分:12)

命令

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用于“人类可读”(包括排序和du)
  • 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

答案 4 :(得分:4)

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

答案 5 :(得分:1)

简单快捷:

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

*需要GNU Parallel

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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 magic,用加号(+)符号替换每个空格,最后bc(基本计算器)进行数学计算。

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

答案 8 :(得分:0)

另一个简单的解决方案。

$ 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 :(得分:0)

您可以使用以下内容按大小列出文件 du -h | sort -hr |更多 要么 du -h --max-depth = 0 * | sort -hr |更

答案 10 :(得分:0)

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

du -sh */ | sort -n

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