简介

rm命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。 rm也是一个危险的命令,使用的时候要特别当心(比如在/(根目录)下执行rm -rf /)。所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑。

命令格式

rm [OPTION]… FILE…

常用参数

-f 忽略不存在的文件,不会出现警告信息
-i 删除前会询问用户是否操作
-r 递归删除
-v 显示指令的详细执行过程
-I 只询问一次

示例

  1. ## -f 忽略不存在的文件,不会出现警告信息
  2. [root@localhost ~]# rm testastata.txt
  3. rm: cannot remove testastata.txt’: No such file or directory
  4. [root@localhost ~]# rm -f testtt.txt
  5. [root@localhost ~]#
  6. ## -i 删除前会询问用户是否操作
  7. [root@localhost ~]# echo aaa > filea.txt
  8. [root@localhost ~]# rm -i filea.txt
  9. rm: remove regular file filea.txt’? y
  10. ## -r 递归删除 ; -v 显示指令的详细执行过程
  11. [root@localhost ~]# mkdir -p a/b/c/d/
  12. [root@localhost ~]# touch a/b/c/d/test.txt
  13. [root@localhost ~]# tree a
  14. a
  15. └── b
  16. └── c
  17. └── d
  18. └── test.txt
  19. 3 directories, 1 file
  20. [root@localhost ~]# rm -v a ## 没有 -r,不允许递归删除
  21. rm: cannot remove a’: Is a directory
  22. [root@localhost ~]# rm -rv a
  23. rm: descend into directory a’? y
  24. rm: descend into directory a/b’? y
  25. rm: descend into directory a/b/c’? y
  26. rm: descend into directory a/b/c/d’? y
  27. rm: remove regular empty file a/b/c/d/test.txt’? y
  28. removed a/b/c/d/test.txt
  29. rm: remove directory a/b/c/d’? y
  30. removed directory: a/b/c/d
  31. rm: remove directory a/b/c’? y
  32. removed directory: a/b/c
  33. rm: remove directory a/b’? y
  34. removed directory: a/b
  35. rm: remove directory a’? y
  36. removed directory: a
  37. ## -I 只询问一次
  38. [root@localhost ~]# mkdir -p a/b/c/d/
  39. [root@localhost ~]# touch a/b/c/d/test.txt
  40. [root@localhost ~]# rm -Ivr a
  41. rm: remove 1 argument recursively? y
  42. removed a/b/c/d/test.txt
  43. removed directory: a/b/c/d
  44. removed directory: a/b/c
  45. removed directory: a/b
  46. removed directory: a

删除的原理

rm: 可以备份,尽量不要删除,比删除更好的是重命名 —> 只删除文件链接,重启、重新写入后回收
删除文件时,使用绝对路径或者进入到目标路径下后使用删除命令 –> 禁止使用rm –rf ./XXX文件【少个点就是根目录了】

文件删除原理

Linux通过文件link的数量控制文件的删除,只有当一个文件不存在任何link的时候且没有程序调用的时候,文件才会被真正删除。就rm命令而言,就是减少磁盘引用计数i_link(文件到inode的链接数量);inode节点指向存储数据的block,删除文件并不是清除inode和block,而是将文件的硬链接为0,引用计数为0 才能删除文件。
注:如果有新的数据存储或者系统通过类似fsck命令做磁盘检查的时候,被删除的数据块和目录会被释放,数据无法找回

文件删除的条件

i_nlink 文件的硬链接数量,磁盘的引用计数器 i_count 内存引用计数(一个文件被几个程序调用,有一个程序使用 i_count + 1 ) i_link = 0 && i_count =0

删除一个文件,也是删除上一级目录的block里面的文件名

相关问题

  1. 问题1:当执行了删除操作后,ls 无法查找到这个文件,但是调用这个删除文件的进程却正常执行,依然能够读取和写入文件内容?
  2. 答案: 因为rm只是减少了i_nlink,如果没有其他的链接了[即i_link=0】,但由于文件依然被进程使用,所以即时执行了rm命令,系统并未真正的删除。
  3. 只有当i_linki_count==0时候,系统才会整正删除这个文件,也就是删除文件还需要解除进程对该文件的调用才行。
  4. 问题2:当文件没有被调用,但是执行了rm命令,删除后的文件还能找回来么?
  5. 答案: rm只是减少了i_link的数量,实际就是将文件的inode的链接删除了,但是并没有删除文件实体(block数据块),如果停止机器工作,还是可以找回数据的。
  6. 如果此时继续有数据写入,当新数据就可能会被分配到被删除的数据的block数据块,此时文件就会被真正的回收。
  7. 问题3:被进程占用的文件能否被删除?
  8. 答案:
  9. 问题4:如何找回没有链接指向但被进程占用的文件?
  10. 答案: lsof -c 'vim' 根据后台占用文件的命令查找