Rm重定向防止误删除以及数据找回的最佳解决方案

  1. 了解linux的童鞋应该知道,linux下的文件系统和Windows的不同,使用了inode这个数据结构记录文件系统对象(文件,目录等等)。
  2. 每个inode结构都用一个整数值表示,一个文件对应一个inode号码,用这个号码从inode表中可以找到这个文件。
  3. 当使用rm删除文件的时候,也就删除了文件对应的inode号码,系统回收inode号码,重新分配。

简单的说,希望渺茫,当你在看这篇文章的时候,系统可能已经在重写覆盖源位置了,作者之前多次误删代码,没有一次找回来过,大概这就是命吧!

  1. rm删除的只是inode号码,数据仍然还在原来的位置,只是我们没有了inode号码,无法定位到原来的位置。
  2. 系统会回收重新分配inode,原来位置的数据有可能被重写覆盖。
  3. 如果出现了rm误删除,应该立即unmount文件对应的磁盘
  4. sudo apt install extundelete该工具可以恢复未被覆盖的误删数据,具体原理和使用方法见百度。
  5. 若删除的是/目录下的文件,应该立即重启进入单用户模式,设置/目录为只读模式。然后使用extundelete工具。

rm命令直接就删除了文件,如果能将删除的文件放入回收站就好了, trash-cli程序提供了删除文件到回收站的功能,有以下几个命令:

Command Description
trash-put 将文件或目录移入回收站
trash-empty 清空回收站
trash-list 列出回收站中的文件
restore-trash 还原回收站中的文件
trash-rm 删除回收站中的单个文件
注意
当使用sudo执行rm时,sudo会忽略后面的别名,按原来的rm命令执行,解决办法是将sudo也变成别名"sudo “,如果别名值后面是空格,bash会检查空格后面是否也为别名(bash手册)。
  1. 安装trash-cli,sudo apt install trash-cli

  2. root用户和普通用户为trash-put设置别名rm,为了防止误删,最好两者都设置一下。

    • 普通用户设置别名:
      • 编辑~/.bashrc,在最后一行写入
      1
      2
      
      alias rm="trash-put"
      alias sudo="sudo "
      
      • 使bash生效 source ~/.bashrc
    • root用户设置别名:
      • 编辑/root/.bashrc,在最后一行写入
      1
      2
      
      alias rm="trash-put"
      alias sudo="sudo "
      
      • 使bash生效 source /root/.bashrc
  3. 测试别名是否生效。

    • 普通用户: rm -hsudo rm -h
    • root用户: rm -h

总结

没有经历过,哪会在意这些细节,一直以为自己很小心,rm的肯定是不需要的文件,所以也就不放在心上。可是,常在河边走,哪有不湿鞋。写这篇博文时,作者已经历两次惨案了,多么痛的领悟~