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


107

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

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

那可能吗?


2
您对目录的“大小”到底是什么意思?它下的文件数(是否递归)?它下面的文件大小的总和(是否递归)?目录本身的磁盘大小?(目录被实现为包含文件名和其他信息的特殊文件。)
Keith Thompson

应为递归下文件的大小总和
Kit Ho

1
@Kit:那du就是答案。
基思·汤普森

@KeithThompson @KitHo du命令估计文件空间使用情况,因此,如果要获取确切的大小,则无法使用它。
ztank1013 2011年

@ ztank1013:根据您所说的“确切大小”,du(至少是GNU coreutils版本),您可能可以选择提供信息。
基思·汤普森

Answers:


218

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

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

或添加-h以获得人类可读的大小,并添加-r首先打印较大的目录/文件。

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

23
du -h也需要sort -h确保,说981M之前1.3G;与sort -n只有数字将予以考虑,他们会是南辕北辙。
Smylers 2013年

这不会列出当前目录中单个文件的大小,只会列出其子目录的大小以及当前目录的总大小。您还将如何在输出中包括单个文件(以回答OP的问题)?
Erik Trautman

@ErikTrautman列出文件也需要添加-a和使用,--all而不是--max-depth=1像这样du -a -h --all | sort -h
Franco

太棒了!几年来,我一直在做一些比较慢的事情。:)
Colby Blair 2014年

6
sort -h仅适用于GNU的版本/ Linux的,没有运气与BSD / OS X.
djule5

20

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

du -h -d 1 | sort -n


显然,但并不奇怪。
Josh Habdas

20
du -s -- * | sort -n

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

使用du -sm甲基溴单位等我总是使用

du -smc -- * | sort -n

因为总行(-c)出于显而易见的原因最终将排在底部:)

PS:

  • 查看有关处理点文件的注释
  • 我经常使用'du -smc / home / / | sort -n | tail'可以感觉到大块的确切位置

5
du --max-depth=1|sort -n或也find . -mindepth 1 -maxdepth 1|xargs du -s|sort -n包括点文件。
Arnaud Le Blanc

@arnoud:我也使用它,但是对于这个问题(/ answer)来说似乎不是正确的补充:)
sehe 2011年

@ arnaud576875,find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -n如果找到的某些路径可能包含空格。
Lri 2011年

1
这是一个伟大的变体,可让人们最大sudo du -smch * | sort -h | tail
程度地理解它

16

命令

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更适合此任务。

在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 -hs * | 排序-hr。-s(摘要)与--max-depth = 0
rasmusx

5

ls -S按大小排序。然后,也要显示大小,则ls -lS给出一个长(-l),并按大小(-S)显示排序。我通常-h也会添加,以使内容更易于阅读ls -lhS


1
啊,对不起,您的帖子还不清楚。您想要的du,似乎有人发布了。@sehe:取决于您对real的定义-它显示该目录用于存储自身的空间量。(这不是在增加子条目的大小。)这不是随机数,也不总是4KiB。
Thanatos

1

简单快捷:

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

*需要GNU Parallel


0

我想我可能已经想通了。这将给出所有文件和所有目录的排序列表,并按文件大小和目录中内容的大小排序。

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

没关系,sehe提供了一个简单得多的解决方案。我每天都学到新东西!
dvorak

我认为使用du不是一种选择,它只会给您大概的结果。
ztank1013 2011年

0

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

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %s文件上的命令将返回其大小(以字节为单位)。tr这里的命令用于克服xargs命令限制(显然用管道xargs将结果拆分到更多行上,这破坏了我命令的逻辑)。因此tr,请注意用+(加号)替换换行符。sed唯一的目标是+从结果字符串中删除最后一个符号,以避免bc像通常那样进行数学运算的final (基本计算器)命令发出抱怨。

性能:我在多个目录上进行了测试,文件顶部超过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实用程序返回每个文件的已分配空间,而不是实际消耗的空间。

[初始版本]如果需要知道文件夹的确切总大小,
则不能使用ducommand,因为(根据手册页的引用)du估计文件空间的使用情况。因此,这将导致您得出错误的结果,即近似值(可能接近总和大小,但很可能大于您要寻找的实际大小)。

我认为可能有不同的方式回答您的问题,但这是我的:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

它会找到所有文件。目录(使用您喜欢的目录更改。),还包括隐藏文件,并且(使用xargs)将它们的名称输出在一行中,然后使用生成详细列表ls -l。这个(有时)巨大的输出通过管道传递给cut命令,并且仅采用第五个字段(-f5),即以字节为单位的文件大小,并再次通过管道对接,xargs从而再次产生一行由空格分隔的大小。现在使用sed魔术,用加号(+)替换每个空格,最后bc(基本计算器)进行数学运算。

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


如果diretory太大,则挂断了很长时间,请尝试在您的主目录上工作:p
Kit Ho

@KitHo好吧,恐怕没有简单快捷的方法来获得精确的结果而不搜索每个文件并增加其大小,因此命令延迟主要取决于搜索到的目录下有多少个文件...但是我相信有改善的余地...很好的挑战!
ztank1013 2011年

@KitHo嘿,在我的答案中看看增强版 ...,当然让我知道!
ztank1013 2011年

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”将显示人类可读的大小,但我们无法使用此方法进行排序。



0

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

du -sh */ | sort -n

这使我了解了哪些目录消耗了最多的空间。之后,我可以进行更精确的搜索。


这种工作方式,但是在排序时会忽略文件大小上的单位。
本杰明·恩沃尔
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.