Linux下文件删除

2024/7/15·1 views

当你在Linux系统中删除一个文件时,文件的数据并不会立即从磁盘上移除。相反,文件系统会将文件标记为删除并释放其占用的磁盘空间,以供将来存储新的文件。这个过程被称为"删除"(delete)或"解除链接"(unlink)。

然而,由于文件系统的设计,删除文件并不一定会立即释放其占用的磁盘空间。这是因为文件系统通常会保留已删除文件所占用的磁盘空间,以便在需要时能够更快地存储新的文件。因此,即使你删除了一个文件,其占用的磁盘空间也可能不会立即释放。

为了彻底地释放已删除文件所占用的磁盘空间,你可以使用以下命令:

shell 复制代码
sync

该命令会将所有缓冲区数据写入磁盘,并更新文件系统的元数据。这将确保任何已删除文件的磁盘空间被彻底地释放。

另外,你也可以尝试使用下面的命令来查看磁盘空间的使用情况:

shell 复制代码
df -h

该命令会显示所有文件系统的使用情况,包括已删除文件所占用的磁盘空间。如果你看到磁盘空间仍然没有增加,请尝试使用sync命令来刷新文件系统的缓冲区数据。

如果你使用了 sync 命令但磁盘空间并没有释放,可能是因为该命令只是将缓存中的数据写入磁盘,而不是释放已删除文件占用的磁盘空间。

一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容。

在这种情况下,你可以尝试使用 lsof 命令来查看当前正在使用已删除文件的进程,然后将这些进程杀死。例如,如果你已经删除了名为 "test.txt" 的文件,可以使用以下命令来查找正在使用该文件的进程:

shell 复制代码
lsof | grep test.txt
lsof | grep delete

该命令将显示所有正在使用名为 "test.txt" 的文件的进程。在输出中,第二列是进程ID(PID),可以使用该PID来杀死进程。例如,如果进程ID为1234,可以使用以下命令将该进程杀死:

shell 复制代码
kill -9 1234

注意,使用 kill 命令可以中断进程,因此请确保你知道正在杀死哪些进程,以免影响系统稳定性。

一旦你杀死了所有正在使用已删除文件的进程,磁盘空间应该会被释放。你可以再次尝试使用 df -h 命令来查看磁盘空间的使用情况。

也可以直接将文件清空而不是删除文件

shell 复制代码
echo "" > access.log

误删文件怎么办,举个例子,误删/var/log/messages文件,以root用户执行如下lsof命令,查询打开/var/log/messages文件的进程的进程ID(PID):

shell 复制代码
lsof | grep messages

# rsyslogd 544 syslog 7w REG 8,1 214641 134422 /var/log/messages

lsof命令介绍:Linux lsof命令详解 - 慕城南风 - 博客园 (cnblogs.com)

从上面命令输出可以看到,这个打开/var/log/messages文件的进程的PID544,文件/var/log/messages的文件描述符FD号是7,根据上述的PIDFD,可以在/proc找到对应的文件:

shell 复制代码
ls -al /proc/544/fd/7 

# l-wx------ 1 root root 64 2012-07-14 14:48 7 -> /var/log/messages 

将文件/proc/544/fd/7拷贝到/var/log/messages

shell 复制代码
cp /proc/544/fd/7 /var/log/messages  

然后重新启动rsyslog服务即可恢复被误删除的日志文件,并且新的日志记录能够继续被写入日志文件,以root用户运行service命令:

shell 复制代码
service rsyslog restart 

最后清空日志文件:

shell 复制代码
cat /dev/null>/var/log/messages
快来和小猫聊天吧~