it-swarm.cn

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

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

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

那可能吗?

101
Kit Ho

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

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

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

du -a -h --max-depth=1 | sort -hr
202
Developer
du -s -- * | sort -n

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

使用du -sm作为Mb单位等我总是使用

du -smc -- * | sort -n

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

PS:

  • 请参阅有关处理dotfiles的注释
  • 我经常使用例如'du -smc/home / / | sort -n | tail'来了解大位所在的位置
18
sehe

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

du -h -d 1 | sort -n

15
cevaris

命令

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用于“人类可读”(在sort和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

12
Martin Thoma

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

4
Thanatos

简单快捷:

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

*需要 GNU并行

1
pje

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

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

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

du -sh */ | sort -n

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

0
Pace

[增强版]
这比 初始版本 below要快得多,并且会输出当前目录的所有文件大小的总和:

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命令抱怨参数列表太长。

0
ztank1013

另一个简单的解决.

$ 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
Ambal

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

0
Ghassan Shawahneh