【Linux】使用du、df 和 sort 命令快速找出Linux系统中的大文件

本文详细对比了df和du命令在磁盘空间管理中的作用和差异,介绍了如何使用这两个命令检查磁盘空间,以及如何查找和排序占用空间大的文件。
在性能测试中,我们经常要关注系统磁盘空间,防止因磁盘空间占满而导致的报错,那么具体怎么查看磁盘空间的大小呢?怎么找到占用空间最大的文件呢?

使用df、du并结合sort,可以快速找到系统中的大文件

一、df 和 du 两者区别

1、df---disk free
  • 可以快速获取 磁盘 被占用了多少空间,目前还剩下多少空间等信息。
2、du---disk usage
  • 显示磁盘空间的使用情况,统计 目录(或文件)所占磁盘空间的大小。

是不是感觉字面看起来没啥区别呀?哈哈,实际有很多不同哦

3、df 和 du 的不同点:

(1)统计的范围不同

df 是从总体上统计系统各磁盘的占用情况,不能统计具体的文件夹或文件的大小。

du 既可以从总体上统计,又可以统计具体的某个文件夹或文件的大小。

(2)计算方式不同,计算速度不同

df 通过文件系统来快速获取空间大小的信息,速度快,效率高

du 通过逐级进入指定目录的每一个子目录,逐个计算每个文件大小并相加,最终显示出来。
所以计算速度慢,当文件目录较多文件较大时要等很久很久!!
而且因为要进入每个子目录计算文件大小,如果当前用户对某些文件/夹没有访问权限时,无法进行计算。

(3)计算结果的差异

df  可以获取已经删除的文件。
由于df是通过文件系统来获取空间大小的,当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失了,而是暂时消失了,
当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件。
所以当一个文件刚删除清空没完全释放时,df 仍会把它计算在内。
(当你删除一个大文件前后可以分别用df 命令查看一下,刚删除时还在占用磁盘空间)

du 只能看到当前存在的、没有被删除的文件。
他计算的大小就是当前他认为存在的所有文件大小的累加和。


当文件系统也确定删除了该文件后,这时候du与df 的结果就一致了。
所以在这一点上,可以说du 计算更精确,也可以说df 计算有延迟,根据个人情况使用就行。

二、df 命令

1、df -h
(-h参数使结果以K,M,G为单位,提高信息的可读性)  
[app@VM_18_18_centos jjingli]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1              20G   15G  4.3G  78% /
/dev/vdb              118G  100G   13G  89% /data

默认显示系统所有的磁盘情况,此图中显示当前一共有两个硬盘分区,及各自的占用情况。

2、df -h 分区名
该命令可以指定显示某个分区的占用情况,用的比较少

当使用 df -h 命令看到磁盘占用较高时,需要使用 du 命令进一步查看哪些文件较大,进而删除。

三、du 命令

1、du -sh
(-h 参数同样是为了提高可读性,-s 代表summary,只显示总大小)
[app@VM_18_18_centos jjingli]$ du -sh
6.4G    

默认显示当前目录下所有文件和文件夹的总大小。

当目录下文件夹特别多时,记得不要去掉-s参数,不然会把所有文件夹下的所有文件分别列出来。

2、du -sh 目录名

du -sh 在不指定目录的情况下,默认会显示当前目录下的所有子目录的总大小。

du -sh 目录名 在指定目录的情况下,会显示指定目录下的所有文件或文件夹的大小。

du -sh *  # 显示当前目录下的所有文件和文件夹大小

du -sh /  # 显示根目录下所有的文件和文件夹大小

du -sh /data  # 显示/data目录下所有的文件和文件夹大小
3、du 和 sort 结合对文件排序
# 查看/data目录下的所有文件和文件夹大小,并从大到小排序
du -sh /data | sort -nr

这个命令对吗?
不对!因为du -sh展示的结果单位不同,但是sort排序只能针对数字,导致980KB的文件排在1GB文件的前面。
 
    
# 查看/data目录下的所有文件和文件夹大小,找出所有GB大小的文件,并从大到小排序
du -sh /data | grep G | sort -nr
    
# 这样就可以达到目的了~, 但是如果文件夹较多的话,还要一个一个的进入去找,怎么解决呢?接着看下面:

# 去掉 -s 参数,可以直接查看包括所有文件夹下的所有文件
du -h /data | grep G | sort -nr
<think>嗯,用户想了解Linux系统dfdu命令的用法。这个问题很清晰,但需要区分两个命令的差异点。从系统指令看,需要严格遵循LaTeX格式中文回答要求,还要生成相关问题。 用户可能是个Linux初学者,或者工作中遇到磁盘空间问题。从引用材料看,核心差异在于:df统计文件系统整体空间(包含已删除未释放的文件),而du计算当前存在文件的总。这个知识点容易混淆,需要重点说明。 先整理df的要点:它显示文件系统级别的数据,常用参数-h(人性化单位)、-T(显示文件系统类型)。特别要注意df会包含被进程占用的已删除文件空间,这解释了为什么有时df显示空间不足而du却正常。 对于du,重点在于它是递归计算目录下实际文件大小的,常用-s(汇总)-h组合。du的统计更"实在",但可能因权限问题遗漏部分文件。 使用场景区分很关键:查整体磁盘使用率用df,找大文件du。可以补充个实际例子:当网站无法上传文件时,先用df看分区是否满;若满再用du逐层定位大目录。 最后生成的问题要覆盖进阶需求:比如统计/home下所有目录大小(du -sh /home/*),或排除某些目录的计算(--exclude参数)。还要提醒用户注意权限影响,sudo du可能得到更大结果。</think>在 Linux 系统中,`df` `du` 是两个用于监控磁盘空间的核心命令,它们**关注点不同,计算方式也不同**,常需结合使用才能全面了解磁盘状况。 ### 一、`df` 命令 (Disk Free) **用途**:报告**文件系统级别**的磁盘空间使用情况(总容量、已用空间、可用空间、挂载点)。 **工作原理**:直接从**文件系统的超级块 (superblock)** 中读取元数据信息。这包含了文件系统整体分配的状态,包括已被删除但仍被进程占用的文件(即未释放的空间)。 **关键特点**: * 显示的是**挂载的文件系统**的整体空间视图。 * 结果包含**已被删除但未释放的空间**(被进程占用的文件)。 * 速度非常快(直接读取元数据)。 **常用选项**: * `-h`:以人类可读格式显示(K, M, G)。 * `-T`:显示文件系统类型(如 ext4, xfs, tmpfs)。 * `-i`:显示 inode 使用情况(而非磁盘块)。 **基本用法**: ```bash df -h # 查看所有挂载文件系统的空间使用(人性化显示) df -hT /dev/sda1 # 查看特定分区(/dev/sda1)的空间文件系统类型 df -i /home # 查看/home挂载点的inode使用情况 ``` **输出示例**: ``` 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda1 ext4 20G 8.2G 11G 44% / tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm ``` **何时使用**:当你想快速了解**整个磁盘分区或挂载点还剩多少空间**时,就用 `df`。它是检查“磁盘是否快满了”的首选命令[^1][^3][^4]。 ### 二、`du` 命令 (Disk Usage) **用途**:计算**指定文件或目录**及其子目录**实际占用**的磁盘空间大小。 **工作原理**:**递归遍历**指定路径下的所有目录文件,累加每个文件占用的磁盘块数(通常以 1024 字节/块为单位)。它只统计**当前实际存在的文件**。 **关键特点**: * 显示的是**具体文件/目录**占用的空间。 * 结果**不包含**已被删除但未释放的空间。 * 速度相对较慢(需要遍历文件树)。 **常用选项**: * `-h`:以人类可读格式显示。 * `-s`:仅显示指定目录的总计大小(不显示子目录详情)。 * `--max-depth=N`:显示指定层级(N)的目录大小。 * `-c`:在最后显示总计(常与 `-s` 配合)。 * `-a`:显示所有文件的占用(包括普通文件)。 * `--apparent-size`:显示文件的“表观大小”(逻辑大小),而非实际占用的磁盘块大小(受稀疏文件、块大小影响)。 **基本用法**: ```bash du -sh /home/user # 查看/home/user目录的总大小(-s汇总, -h人性化) du -h --max-depth=1 /var/log # 查看/var/log下第一级子目录的大小 du -ah /etc | sort -rh | head -n 10 # 找出/etc下最大的10个文件/目录 ``` **输出示例**: ``` 4.0K ./dir1 8.0M ./largefile.log 12M . # 当前目录 (.) 总大小 ``` **何时使用**:当你想知道**某个特定目录或文件占用了多少磁盘空间**,或者想**找出占用空间最大的文件/目录**时,就用 `du`[^1][^2][^3]。 ### 三、核心区别总结 (`df` vs `du`) | 特性 | `df` (Disk Free) | `du` (Disk Usage) | | :----------- | :----------------------------------- | :------------------------------------ | | **关注层面** | 文件系统 / 挂载点 | 文件 / 目录 | | **数据来源** | 文件系统超级块 (元数据) | 递归遍历文件树统计实际文件 | | **包含内容** | 包含已删除但未释放的空间 (被进程占用) | 仅包含当前实际存在的文件 | | **速度** | 非常快 | 相对较慢 (需遍历文件) | | **主要用途** | 查看**剩余空间** (磁盘是否快满) | 查看**文件/目录占用空间** (谁占的多) | | **一致情况** | 当文件系统中所有被删除文件都已被释放时,`df` 显示的已用空间 ≈ `du` 计算的总空间 | ### 四、为什么 `df` `du` 结果有时差异巨大? 最常见的原因是**存在已被删除但仍有进程打开的文件**: 1. **进程写日志**:比如一个服务进程打开了一个大日志文件 `app.log` 并持续写入。 2. **删除文件**:管理员执行 `rm app.log` 删除该文件。 3. **空间未释放**:由于进程仍在写入 `app.log`(即使它已从目录结构中消失),文件系统不会立即释放该文件占用的磁盘块。这些空间在 `df` 中仍被计入“已用空间”,但在 `du` 中不会被统计(因为 `du` 找不到 `app.log` 了)。 4. **差异产生**:`df` 显示该分区快满了,而 `du` 检查该分区目录却发现总大小远小于 `df` 显示的已用空间。 5. **恢复一致**:当写入进程关闭文件或终止后,文件系统才会真正释放这些块。此时 `df` `du` 的结果就会趋于一致。 **解决方法**:找到并重启或关闭持有被删除文件句柄的进程(常用 `lsof | grep deleted` 查找)[^2]。 ### 五、总结与使用场景 * **“磁盘还有多少空间?”** ➔ 用 `df -h`。这是检查磁盘健康(空间不足)的第一道命令[^1][^3][^4]。 * **“哪个目录/文件占用了这么多空间?”** ➔ 用 `du -sh * | sort -h` (在目标目录下运行)。用于定位占用空间的“罪魁祸首”[^1][^2][^3]。 * **“为什么 `df` 说空间满了,但 `du` 没找到大文件?”** ➔ 极可能是存在被删除但未释放的文件。用 `lsof | grep deleted` 查找相关进程并处理[^2]。 理解 `df` `du` 的差异是高效管理 Linux 磁盘空间的关键[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值