rm -rf 造成的惨案很多。。
携程误删事故、Kuriko香港NAT区服务中断说明、gitlab数据误删,很多rm惨案历历在目,事故发生的公司损失惨重。我想每个人大概都有类似的经历:辛辛苦苦敲了一天的代码,然后想到了个更好名字,准备把文件夹改名,自信 rm -r a b; cd b
,完事之后发现系统提示 -bash: cd: b: No such file or directory
。你正纳闷呢,突然醒悟到原来使用了 rm
,此时还没有提交代码,也没有其他备份,没办法,只能凭记忆重新来过。
现在妈妈再也不用担心你误删文件了!
效果图
在文件夹test下有一个文件 atext
和一个文件夹 afolder
,如红线部分,当使用 rm afolder
的时候,会有文字提示,并将文件移动到一个文件夹下并不会立刻删除。
说明
其实原理很简单,就是使用 alias
替换掉了系统的rm,利用如下脚本进行“删除”操作:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#!/bin/bash
PARA_CNT=$#
TRASH_DIR=$HOME"/.trash"
CURR_PATH=`pwd`
if [ ! -d $TRASH_DIR ];then
mkdir $TRASH_DIR
fi
for i in $*; do
STAMP=`date +%s`
fileName=`basename $i`
mv $i $TRASH_DIR/$fileName.$STAMP
echo "Removed successfully,It can be recovered by 'mv "$TRASH_DIR/$fileName.$STAMP" "$fileName"'"
done
find $TRASH_DIR -maxdepth 1 -atime +30 -exec rm -rf {} \;
除了“删除”操作,它还会查找 $HOME"/.trash"
目录下超过30天未访问的文件,并把它删掉。这里看到 rm -rf
是不是心中又一哆嗦呢,放心,这里只有找到了文件之后才会执行后面的 rm -rf
,并不会因为不传参数导致直接执行 rm -rf
。不过需要注意的是,在shell中使用rm的时候依然是系统的 rm
,如果需要使用以上脚本进行 rm
,需要写成绝对路径。
这个脚本项目已经放到了git上。
安装
手动安装
1 | 1. 在相应用户目录下建立一个文件夹,例如 '~/shell/'。 |
一键安装
确保你拥有文件夹权限!1
sh -c "$(wget --no-check-certificate https://raw.githubusercontent.com/lcalca1/trm/master/install_trm.sh -O -)"
或者1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/lcalca1/trm/master/install_trm.sh)"
如果执行完还没有生效,尝试 source $HOME"/."${SHELL##*/}"rc"
。