从rm -rf误删文件说起

  相信前两天发生的友部门同事误删项目代码的事情,很多人都知道了。这件事情幸好不是发生在我们小部门,不然又会被领导说我们不专业。
  墨菲定律告诉我们,有概率发生的事情就一定会发生。
  误删文件这种事情发生其实不是最惨的,最惨的是删掉的项目代码在开发的几个月里居然没有用任何代码管理软件进行提交备份!(这种事情在我参与的项目中是不太可能的,在基本功能实现后就会纳入版本管理,服务器建立仓库,因为如果只是本地管理,其实也没有太多意义,毕竟rm -rf *了。)
  这种令人扼(xi)腕(wen)叹(le)息(jian)的事情发生之后,我们应该反思自己做的是否足够好,我们还能做些什么避免这些事情发生在自己身上,或者假使这种事情真的发生在我们身上我们能做些什么让损失降到最小

首先要反思我们是否做的足够好。

  rm命令是Unix系列操作系统中用于删除文件的命令行指令,是英文remove的简写,通常搭配的参数有-r-i-f-v,命令格式微rm [参数] [文件名以空格分隔的一组文件名通配符]

  • r对应recursive递归,用于递归删除目录下所有子目录和其中包含的文件。
  • i对应inform提示,会在删除前提示用户输入y/n,确认是否删除。
  • f对应force强制,这个比较粗鲁,会之间忽略任何错误提示强制执行删除操作。
  • v对应verbose详细,会在执行命令时输出详细信息,很多命令都有这个参数。

  这些常用参数中r参数最常用,f参数危险性最大,i参数最没有存在感但却是很有用的参数。
  rf参数搭配上通配符*威力十分强劲,有些不好习惯的朋友若是沉迷root用户或者热爱sudo,那么一个回车下去,大罗神仙也阻止不了了。要是这时候你又加上了v参数,你就可以体验到一个个文件排队死给你看的绝望了,这时的你可能会嘴里喷出f开头的单词,然后表示再也不用f参数了。
  所以,**f参数一定要慎用,用之前一定要问自己两个问题,我到底是在做什么操作,这个操作没有f参数行不行。**另外,涉及root权限的操作也需要慎之又慎,也要问自己一下,不要因为方便,就干啥都su - root或者sudo,一时root一时爽,一直root悔断肠。
  i参数是被忽略的一个参数,在你删除不确定的目录或者文件时,可以加上这个参数。这样,在删除每一个文件时都会询问是否删除,适合强迫证倾向的朋友。有个小技巧是利用Unix系统命令行的alias别名功能,修改~/.bashrc文件,添加alias rm='rm -i',然后执行. ~/.bashrc使修改的命令行别名生效,这样执行rm命令就相当于默认带上-i参数了。
  但是要注意一点,即使这样也无法阻拦强力的rm -rf *,可能朋友会问为什么呢?是f参数会覆盖i么?
  其实是这样的,添加别名后的rm -rf *指令相当于rm -i -rf *,命令行处理程序(默认为bash)执行时看到rm后明白,“哦,这是一个删除命令”,接着看到-ibash就明白了,“原来这家伙不太自信!”再看到-r,“哦,要删目录了”,最后看到fbash看到这个参数长舒了一口气,“本王就喜欢f了,前面啰啰嗦嗦一大堆最后才说正经事,全干掉全干掉!”
  我们可以了解到bash命令行是按顺序解析参数的,脑袋灵活的朋友可能会提出一个问题,“如果把i参数放到f后面呢?”bingo,是可以弹出提示的。但是alias别名的方法就不太好用了,只能用脚本实现i参数在参数列表最后,这是另外的思路了。

让我们再来看看能做些什么可以避免这类事情发生。

  人生在世总有些事情我们会后悔莫及,正所谓“嫦娥应悔偷灵药,碧海青天夜夜心”,我们有时候就是希望有后悔药或者时光机的存在。
  rm命令不像那些文件管理器中的删除操作,有个专门的“回收站”我们可以找回文件,“要是rm也有回收站功能就好了”,我敢说这绝对不是一个人的心声。这个功能真的可以有。

  trash-cli工具就在命令行提供了类似图形界面的删除文件到回收站的功能,以Ubuntu为例,系统可以通过sudo apt-get install trash-cli命令安装。
  trash-cli提供了如下几个命令。具体使用方法可以参见这篇文章

  • trash-put: 删除文件和目录至回收站中。
  • trash-list:列出回收站中文件和目录。
  • trash-restore:从回收站中恢复文件或目录 trash。
  • trash-rm:删除回收站中的文件。
  • trash-empty:清空回收站

  trash-put命令的基本语法和rm类似,因此,我们可以利用上面提到的alias别名技巧,用trash-put替换rm命令,这样我们每一次rm都是将文件删除到回收站中了,怎么样,是不是很兴奋!
  但是先冷静一下,这里还是有可能会有意外会发生,尤其是那些root/sudo的爱好者,由于alias别名我们是定义在当前用户的bash配置脚本中的,一旦使用root/sudo执行,那么rm还是那个rm,该哭的眼泪一滴也不会少。想避免这种情况的发生,我们可以尝试把alias添加到/etc/bash.bashrc文件中,这样就可以在任何用户生效了。注意,编辑该文件也需要root/sudo权限。

最后我们再来看看万一真的发生了能做些什么把损失降到最低。

  在现代计算机系统中,文件在硬盘上的存储格式与硬盘分区格式有关,在我看来,文件存储的本质是索引,用户数据以特定的数据结构存储在硬盘上,不管我们用图形界面还是命令行查看到“文件”其实都是对应到硬盘上特定数据结构和数据区域,操作系统的文件删除通常不会直接抹去其对应的存储区域数据内容,而是断开了该“文件”与真实存储区域的索引关系,这样用户就找不到“文件”了。因此,只要不修改那段特定区域的数据,文件就是有机会恢复的。
  那么,在不小心删除数据之后,我们需要做的第一件事情一定是保证不再向该文件所在硬盘写入数据!
  通常我们可以选择umount卸载该硬盘分区,或者重新mount挂载为只读分区,如果你不知道或者忘记了命令或者操作,那么关机断电是最明智的选择。那些慌里慌张去浏览器搜索恢复软件、下载安装软件一个个尝试的行为是不可取的,这样有可能会导致操作系统向该文件区域写入数据。
  之后的操作可以选择用LiveCD(操作系统的安装光盘)或者PE U盘进行启动,把当前电脑的硬盘以只读分区挂载。也可以选择把硬盘拆下来找个USB硬盘盒装上,连接到另外的电脑上,以只读形式挂载。
  后面的就是根据出事故的硬盘分区格式选择合适的恢复软件进行操作了。具体能不能完全恢复,还是要看缘分了。如何选择和使用恢复软件可以参见这篇文章

结束

  每天等娃睡了写一点,除去工作上的乱七八糟事情,写了三天总算写完了😂😂,相信能做到上面这几点,rm -rf误删这种事情发生的可能就会小很多,希望这种事情离我们越远越好。
  今天是国庆节,第一篇微信文章,祝祖国生日快乐🎂,祝各位假期愉快!


从rm -rf误删文件说起
https://wuruofan.com/2019/10/04/about-rm-delete-by-mistake/
作者
rf.w
发布于
2019年10月4日
许可协议