rm 

常用选项:

-f  force  忽略不存在的文件

-i  互动模式,删除时会询问是否删除,也是alias别名中默认增加的选项

-r  递归删除(用于目录),建议不用。

实例:

[root@www tmp]# ls
test.txt  yang  yum.log
[root@www tmp]# rm a.txt        #不加参数,删除不存在的文件会报错
rm: cannot remove `a.txt': No such file or directory
[root@www tmp]# rm -f a.txt       #加上-f,删除不存在的文件也不会报错,而且会忽略-i的询问。
[root@www tmp]#
[root@www tmp]# rm -i test.txt
rm: remove regular file `test.txt'? y
[root@www tmp]# cp yum.log yum.log.bak
[root@www tmp]# rm -f yum.log
[root@www tmp]# rm yang            #不加-r删除目录,会报错Is a directory
rm: cannot remove `yang': Is a directory
[root@www tmp]# rm -rf yang          #慎用
[root@www tmp]#

文件删除原理:

文件删除控制的变量:

1.i_link 文件的硬链接数量

2.i_count 引用计数(一个程序使用  i_count +1)

[root@www ~]# ls -lhi

130599 -rw-r--r--. 2 root root   74 11月 19 06:56 b

130599 -rw-r--r--. 2 root root   74 11月 19 06:56 d


[root@www ~]# rm -f d  删除文件,只是删除了i_link

[root@www ~]# ls -lhi

130599 -rw-r--r--. 1 root root   74 11月 19 06:56 b

   

Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2link计数器:i_count i_nlink

 i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。

当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。

对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?

这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlinki_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。

以上讲的i_nlinki_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?

rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,并没有删除文件的实体即(block数据块),此时如果及时停止机器工作,数据是可以找回的,如果继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了。


备注:根据以上原理,实际情况会出现以下问题,web服务器磁盘空间不够了,删除了所有无用日志还是先是磁盘空间不足,但是用du -sh /*(查看根下所有文件的大小)发现磁盘空间占用的远小于硬盘总大小,这就是因为只删除了一个i_nlink,而还有其他进程在使用着这些log文件,apache或者tomcat,重启再看就ok了。