du -sh 如何找到最大的文件夹_如何使用Linux的du df baobak等命令检视磁盘空间状态?

b6630c376c304ccfca9e1294827d7581.png

太空场景。有小行星和两个行星元素的蓝色星云。Space scene. Blue nebula

1.鸟瞰全局

当我们试图从宏观的视角鸟瞰磁盘的空间的总体使用状况时,应该使用 df(disk usage) 命令。

$ df -h |sort -h -k 2
87fd0bed260c70503cf8972149a717fa.png

从最后一行

'/dev/mapper/vgkubuntu-root  110G   95G  9.7G  91% /'

可知,我的硬盘空间只剩下 9.7G 可用(Available)。这也是将disk free的本义,即disk-free=Size-Used

2.局部具体分析

审视当前Home目录下各个文件的磁盘占用状态,应用 du 命令。人如其名,du 是硬盘使用(Disk Usage)的缩写。

$ du -sh * |sort -hr |nl
5eb27ce4052d172acbad2b239dd3dda2.png

上例中的 -s 是 --summarize 简写形式,读取指定参数总的硬盘占用空间;-h 为 --human-readable 即以人类可读的形式显示(如 1K 234M 2G)。

命令运行之后,各文件与目录的磁盘占用状态一目了然地展示出来,其中最大的是 Videos 目录,足足有40G,而我可用的硬盘空间只剩下区区9.7G,似乎应该马上采取行动,将其转移到其他存储设备上。

3.报告隐藏文件的信息

上面的结果给出了有价值的参考。然而再一观察则发现,隐藏的目录没有统计进来。这与星号*这个wildcard(通配符) 的默认设置有关,因为只显示非隐藏的目录与文件。

我们可以调用 shopt 命令修改其默认属性:

$ shopt -s dotglob

重新运行上述命令:

$ du -sh * |sort -hr |nl |tail -n 20
7897694973a97d0a2ca1a91b228d98a4.png

可以看到隐藏的目录也显示出来。得到结果之后,将刚才修改的属性恢复到默认。

$ shopt -u dotglob # unset 关闭$ shopt dotglob # 查看是否已经关闭dotglob         off

这个例子修改了系统的默认属性,乃是迂回的解决方案。我们最好还是求诸于 du 命令本身,找到直接的方法。

Linux通配符的深入分析,请查阅 《透彻分析Linux的通配符》

4.指定目录的深度

du 是个递归命令,默认情形下,它会向下无限层级的搜索和读取信息。

$ du -h | head -n 20
f2c5c1ded82f867f318a3383e30aa759.png

而我们若要只参阅 Home 的一级目录的磁盘占用情况,需要指定目录的深度。

$ du -h --max-depth=1 ~ |sort -hr |nl
f936268926f76d4d293df387d08b821e.png

从结果中,我们看到了隐藏目录的大小,距离目标又更进了一步。

5.显示所有文件和目录

指定目录的深度之后,隐藏目录显示出来。但是 du 命令默认只从总体上统计目录的磁盘占用,并不单独输出文本文件的大小。

我们可以通过 find 命令获悉,Home目录下合计有40个文件。

$ find ~ -maxdepth 1 -type f |nl
4ec8228f23a58337ad390fd07d174a66.png

(find命令的详尽分析请参阅:《万物皆为可循可查,诸事直如掌中手中》)

然而,以上的40个文件,从 du 命令输出的结果中是看不到的。比如我们从其中查找 start.sh 这个文件。

先用 ls 命令核实:

$ ls -l start.sh-rwxr-xr-x 1 spiritme spiritme 1793 May  7 06:20 start.sh

但是从 du 命令中看不到 start.sh 文件

$ du -h --max-depth=1 ~ |grep start.sh# 无结果返回

鉴于此,我们必须显式的调用 -a 选项。

-a, --all write counts for all files, not just directories

添加 -a 选项后,运行

$ du -h -a  --max-depth=1 ~ |grep start.sh4.0K    /home/spiritme/start.sh

此时,start.sh 总算露脸现身了。完整的输出结果如下:

$ du -h -a  --max-depth=1 ~ |sort -hr |nl
062ea1d6f7d0022ef36c3a57d6f76f76.png

统计Home目录下有文件和文件夹合计94项,其中案例4中的结果有52个目录(directories),本案例 find 命令找到 40 个文件,另外还有两个是系统默认的目录(.和..),三者之和正好为94。

6.解索引软连接

我们观察案例5中输出结果的最后一行

$ du -h -a  --max-depth=1 ~ |sort -hr |nl....    94  0       /home/spiritme/.doom.d

文件 .doom.d 的大小为 0。

检查此文件:

$ ls -l .doom.dlrwxrwxrwx 1 spiritme spiritme 37 Jan 31 15:02 .doom.d -> /home/spiritme/Documents/primary.doom.d

发现它是指向目录'/home/spiritme/Documents/primary.doom.d'的软连接,文件大小只有37个字节。

我们从 ls 命令中将其解索引,查看其指向目录所占用的磁盘空间:

$ ls -laLh |grep doom.ddrwxrwxr-x  8 spiritme spiritme 4.0K May 15 15:43 .doom.d

其中 -L 选项为‘解索引’(--dereference)。

-L, --dereferencewhen  showing  file  information  for a symbolic link, show information for the file the link references rather than for the link itself.

同样的逻辑,du 命令也有 dereference 的选项。

 -L, --dereference dereference all symbolic links

综合以上案例,我们运行一次完整的命令:

$ du -h -a -L --max-depth=1 ~ |sort -hr |nl
4e993a4e39f07ebaae21138abfdc8014.png

从打印的结果中,我们看到了 .doom.d 这个隐藏的软连接文件所指向的目录的实际大小为 190M。

7.按照文件大小筛选

通过以上六步,我们对计算机磁盘的全局和局部做到了心中有数。接下来,探索一番如何按照文件大小进行筛选。

比如查看Home目录下所有容量大于1G的目录与文件,可以将 du 与 grep 协同使用:

$ du -h -a  ~ |sort -hr | grep -e ^[0-9.]*G -e ^[0-9]*M |nl     1  76G     /home/spiritme...    44  1.2G    /home/spiritme/Videos/BibleProject/01.How-to-Read-Bible    45  1.1G    /home/spiritme/Videos/BibleProject/08.OldTestament/old-testament-1/exodus-part2-images

得到了45个结果。

同理,我们也可以查看所有大于1M的文件与目录:

$ du -h -a  ~ |sort -hr | grep -e ^[0-9.]*G -e ^[0-9.]*M |nl |tail...  8227  1.0M    /home/spiritme/anaconda3/pkgs/cffi-1.12.3-py37h2e261b9_0  8228  1.0M    /home/spiritme/anaconda3/pkgs/astropy-4.0.1.post1-py37h7b6447c_0/lib/python3.7/site-packages/astropy/visualization  8229  1.0M    /home/spiritme/anaconda3/lib/python3.7/site-packages/pygal

输出了8229个结果。

我们甚至还能查看大于1G的目录的树状图结构

460414bf2eccff22e9c47570a4b00b2f.png

(Tree命令的详尽分析请参与 《透彻分析Linux的tree命令》

以上方法只能查看大于1G或者大于1M的文件,当我们需要查看大于95M的文件呢?

du 命令贴心的准备了'最低门槛‘(threshold) 选项。

 -t, --threshold=SIZE exclude entries smaller than SIZE if positive, or entries greater than SIZE if negative

添加此参数运行后输出293个结果:

du -ahL --threshold=95M ~ |sort -hr | nl     176G/home/spiritme     240G/home/spiritme/Videos     320G/home/spiritme/Videos/BibleProject   ...   29396M/home/spiritme/Public/nikola-post/output

倘若查看所有小于95M的文件,只需在数字95前面添加负号。

$ du -ahL --threshold=-95M ~ |sort -hr | nl |tail...396752  0       /home/spiritme/anaconda3/lib/python3.7/site-packages/loguru/py.typed396753  0       /home/spiritme/anaconda3/lib/python3.7/site-packages/alembic/runtime/__init__.py396754  0       /home/spiritme/anaconda3/envs/.conda_envs_dir_test

输出了396754个文件。

由此,我们获得了一个启发,当按照文件大小进行筛选之时,除了可以应用早先文章中介绍的 ’find -size' 方法之外,也可以从 du 的视角查看。这两个命令的逻辑是完全一致的。

find 命令版本如下:

376ebb5e53859ee3333a4c22f913876b.png

8.图形界面

最后,除了命令行的方法,我们还有GUI图形界面的途径可供选择。

安装baobab,

sudo apt install baobak

运行之后就能看到一个漂亮的可视化界面

c22fc5d358bb0c6b4053a6bef855b927.png

9.关联性工具

其他查看磁盘空间的命令行工具还有 lsblk 和 fdisk

运行 lsblk 命令:

$ lsblk | sort -k 4 -h
c6bde29469eaf9e3cf642f47f2e3e4ab.png

运行 fdisk 命令

$ sudo fdisk -l
8edbc37dcd00578f66acea22e7962bc0.png

10.收尾总结

本文中,我们先从 df(disk free) 命令出发,鸟瞰磁盘空间的全局。接着下降到局部视角,用 du(disk usage) 命令,因循持续改进的逻辑,逐步解决审查当前Home目录各个文件磁盘占用状态的问题。相关命令与参数总结如下:

449870be80fdbe700ee356e7ac326306.png

作为收尾,回到最初的问题,在Home目录下,可以应用简单的解决方案:

du -sh *

当要检视一级目录下所有的文件时,使用命令:

du --max-depth=1  -all --human-readable --dereference ~  # 简写为du -d 1 -a -h -L# 或者du -ahL -d 1

换言之,要么最简单的命令 `du -sh *`,要么使用复杂的组合` du -ahL -d 1`。

以上完结,盼对你有点滴启发与帮助。

本文中涉及的其他两个命令 find 和 tree的文章如下:

《透彻分析Linux的通配符》
《透彻分析Linux的tree命令》
《透彻分析Linux的find命令》

3e5220218b256fab4c38e5a4a8f1e5aa.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值