使用 rm -rf 再也不用担心

rm -rf 造成的惨案很多。。

携程误删事故Kuriko香港NAT区服务中断说明gitlab数据误删,很多rm惨案历历在目,事故发生的公司损失惨重。我想每个人大概都有类似的经历:辛辛苦苦敲了一天的代码,然后想到了个更好名字,准备把文件夹改名,自信 rm -r a b; cd b,完事之后发现系统提示 -bash: cd: b: No such file or directory。你正纳闷呢,突然醒悟到原来使用了 rm,此时还没有提交代码,也没有其他备份,没办法,只能凭记忆重新来过。

现在妈妈再也不用担心你误删文件了!

效果图

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
2
3
4
1. 在相应用户目录下建立一个文件夹,例如 '~/shell/'。
2. 复制(通过剪贴板)/下载(通过[git](https://github.com/lcalca1/trm))该脚本到 1 中的文件夹,并命名为 'remove.sh'。
3. 打开 `~/.bashrc` 或 `~/.zshrc` 并把 'alias rm='sh ~/shell/remove.sh' 放到文件末尾。如果你不知道你使用的哪种shell,在命令行中使用 'echo $SHELL'.
4. 使用命令 'souce ~/.bashrc'。
一键安装

确保你拥有文件夹权限!

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"