谷谷小师妹 发表于 2023-11-4 15:26:35

Linux查找大文件、大目录 - 解决磁盘空间不足的问题

Linux查找大文件、大目录 - 解决磁盘空间不足的问题

df
Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

一般/dev/vda1为系统盘,像vdb、vdc为数据盘。

1、-h
我们发现df输出的格式没有单位,可读性太低了。使用-h参数可解决。
-h或–human-readable 以K,M,G为单位,提高信息的可读性。


du
Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。
-h:以人类可读的方式显示

  -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小

  -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小

  -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和

  --apparent-size:显示目录或文件自身的大小

  -l :统计硬链接占用磁盘空间的大小

  -L:统计符号链接所指向的文件占用的磁盘空间大小

  1、du -h:这个就不多说了。
1、-h
du -h

从输出可以看出du是显示所有目录和子目录所占用的磁盘空间。
du -sh显示当前目录大小
du -sh
28G .du -h .git 显示.git目录下面的所有目录和子目录的大小


2、-a
du -ah .git
-a显示所有目录(包括隐藏目录)


3、–max-depth=<目录层数>
上面的命令都是显示所有目录,如果我只想显示指定层数目录呢?
使用--max-depth=<目录层数> 超过指定层数的目录后,予以忽略。

比如最多显示1层:
du -h --max-depth=1
17M   ./iot
38M   ./omj
2.2M    ./TIOTSmartSpeaker
183M    ./fzd
116M    ./nodeServer
1.5G    ./apache-cassandra-3.0.28
4.0K    ./live
18M   ./project
2.0G    ./wss
512K    ./sql
23G   ./manager
12M   ./bi_n
80M   ./bi
212M    ./omj588
106M    ./kafka_2.12-3.4.0
28G   .
显示多了不方便查看,太乱多,如果再多点,还很难查到,哪个目录或文件大,就要用到排序。

4、sort
你有没有发现上一条命令文件列表的目录大小并不是按照从大到小或从小到大的排序。
使用sort命令即可排序。
使用|来分隔不同的命令。

从上图可以看出,只是输入sort是不行的,文件大小并没有排序。
是的,必须加入sort参数才行。
下面说下本文会用到的sort参数:
-r(--reverse) 以相反的顺序来排序
-h( --human-numeric-sort):使用易读性数字(例如:2K、1G),默认从小到大排序
-s -s或–summarize 仅显示总计。只显示指定目录或当前目录的大小。

我们只显示一层目录大小并排序,就能很多找出最大的目录或文件。
du -ah --max-depth=1| sort -hr
28G   .
23G   ./manager
2.0G    ./wss
1.5G    ./apache-cassandra-3.0.28
212M    ./omj588
183M    ./fzd
171M    ./root@172.24.132.110
171M    ./jdk-8u231-linux-x64.rpm
132M    ./event-0.0.1-SNAPSHOT.jar
116M    ./nodeServer
106M    ./kafka_2.12-3.4.0
102M    ./kafka_2.12-3.4.0.tgz
80M   ./bi
58M   ./0414_2.log
38M   ./omj
29M   ./0414.log
18M   ./project
17M   ./iot
16M   ./tmp.tar.gz
12M   ./bi_n
11M   ./3.4.0.tar.gz
8.2M    ./06.log
2.2M    ./TIOTSmartSpeaker
512K    ./sql
16K   ./history.sql
4.0K    ./live
4.0K    ./extern_device.sql

也可以用find来查找

find
find用于查找到的子目录和文件全部进行显示(包括隐藏目录和文件)。
-name
使用-name查找当前目录及子目录所有文件后缀为.sh的文件。

查找当前目录,.可以省略掉;
查找其他目录,将.替换为路径

-type c
-type c : 文件类型是 c 的文件。

-type f:查找普通文件
-type d:查找目录
例如将目前目录其其下子目录中所有一般文件列出:

find . -type f

-ctime
-ctime n : 在过去n天内被修改过的文件
将当前目录及其子目录下所有最近 30 天内更新过的文件列出:

有关find时间相关的参数-atime、-ctime、-mtime,我在Linux使用一条命令删除指定时间的文件
中有介绍。

-size
-size:查找指定大小的文件

查找大于100M的文件:

查找大于100M小于200M的文件:

快速查找大目录
查找系统根目录下的大目录
sudo du -h --max-depth=1 / | sort -hr

注意:系统根目录使用du命令,需要root权限。

如果小目录过多的话,会显示过多,导致需要滑动查看。
我们使用head命令,来显示列表前几个,默认显示前10个。
要查看前5个,请使用head -5:


可以看到根目录下`ktt`目录,占用空间很大。

接着查看ktt目录下面的大目录
这里我们将目录层次设置为8,以便减少查询次数。

du -h --max-depth=8 /ktt/ | sort -hr| head -40
按照此方法,直至查询到可以删除的目录。

快速查找大文件
例如查找用户目录下面大于100M的文件、需包含文件属性、以及从大到小排序:

find ~ -type f -size +100M | xargs ls -lhS

那如果我只想显示文件大小和文件路径呢?

find ~ -type f -size +100M | xargs du -h | sort -hr

xargs:find命令的输出通过管道xargs执行。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

谷谷小师妹 发表于 2023-11-6 18:12:59

删除日志
rm *.log

再查看硬盘空间并没释放
df -h

当由于文件删除,发现空间没有被释放,即df和du命令不一致时:
使用lsof -n | grep deleted命令查看处于deleted状态的文件,即表示文件被删除,但仍有进程使用这个文件,导致内存空间没有被释放。
重启此服务(程序)就能释放空间了
页: [1]
查看完整版本: Linux查找大文件、大目录 - 解决磁盘空间不足的问题