在linux系统中,使用rm命令删除文件时,系统默认只是删除了文件对应的目录项,也就是文件在目录中的索引记录,并没有直接清除文件实际存储在磁盘上的数据块,因此很多时候删除文件后磁盘空间不会立刻释放。

为什么rm删除文件后空间可能不释放
linux的文件系统中,文件的数据存储由两部分组成:目录项(记录文件名和inode的对应关系)和inode对应的数据块(实际存储文件内容)。当进程打开了某个文件时,会持有该文件的句柄,只要进程没有关闭这个文件,即使使用rm删除了目录项,inode和数据块的引用计数不会归零,系统就不会回收这些数据块占用的空间。
常见占用空间未释放的场景
- 正在运行的服务或进程打开了目标文件,比如日志文件被应用持续写入,删除后应用没有重启,句柄一直存在。
- 删除的是大文件,进程短时间内不会释放句柄,空间就会持续显示被占用。
- 删除的文件存在硬链接,rm只删除了其中一个硬链接,其他硬链接还存在,数据块不会被回收。
如何判断被删除的文件是否还在占用空间
可以通过lsof命令查看当前系统中被删除但仍在被进程占用的文件,具体命令如下:
# 查看所有被删除但仍被进程占用的文件 lsof | grep deleted
执行命令后会输出类似下面的内容:
nginx 1234 root 10w REG 8,1 1073741824 123456 /var/log/nginx/access.log (deleted)
上述输出表示nginx进程(PID为1234)打开的/var/log/nginx/access.log文件已经被删除,但是进程还在持有该文件的句柄,文件大小是1073741824字节,也就是1GB,这部分空间暂时不会释放。
如何释放rm删除后未释放的空间
方法一:重启占用进程
找到占用被删除文件的进程后,重启对应的进程即可让进程关闭文件句柄,系统会自动回收对应的数据块空间。比如上面的nginx进程,重启命令如下:
# 重启nginx服务 systemctl restart nginx
方法二:清空文件内容而不删除文件
如果是日志类文件,不想重启进程,也可以先清空文件内容,再删除文件,这样空间会立刻释放。操作步骤如下:
# 先清空被删除的文件(通过/proc/PID/fd/文件描述符操作) echo "" > /proc/1234/fd/10 # 再执行删除操作 rm /var/log/nginx/access.log
其中1234是进程PID,10是lsof命令输出中对应的文件描述符编号。
rm命令删除文件的空间释放总结
rm命令本身不会直接释放文件占用的磁盘空间,只有当文件的所有引用(目录项、进程句柄)都被清除后,空间才会被回收。日常使用中如果需要删除正在被进程使用的文件,建议先确认进程状态,选择合适的方式操作,避免磁盘空间异常占用的问题。
| 操作场景 | 空间释放情况 | 处理方式 |
|---|---|---|
| 删除未被任何进程打开的文件 | 立刻释放 | 直接执行rm命令即可 |
| 删除被进程打开的文件 | 暂不释放 | 重启进程或清空文件内容 |
| 删除存在多个硬链接的文件 | 仅删除当前硬链接,空间不释放 | 删除所有硬链接后空间释放 |
rm_commandlinux文件空间释放文件句柄修改时间:2026-06-25 21:36:36