Linux下文件删除
当你在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文件的进程的PID是544,文件/var/log/messages的文件描述符FD号是7,根据上述的PID和FD,可以在/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