我发现Bash中的目录大小并不容易?
我希望在输入ls -<some options>
时,它可以递归地列出目录文件大小的所有总和,同时按文件顺序排序。
这可能吗?
答案 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
)最终会出现在底部,原因显而易见:)
答案 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
更适合此任务。
在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)
答案 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
这让我了解哪些目录占用的空间最多。然后,我可以在以后运行更精确的搜索。