避免 rm -rf /*删库:建立回收站机制
1. 写在前面
rm -rf /* 的形式有很多:
rm -rf /*(直接潇洒走一回)rm -rf $abc/*(变量所指不存在)rm -rf abc /*(多了一个硬核空格”“)- …
它的威力,懂的人自然懂。
对于此,除了重新认识 rm 、rm -rf以及空格,也要做一些安全措施,避免此类事情的再次发生。
2. 两种思路
以下两种思路,可能在本质上来看都是一样的:
- 将需要删除的文件移动(而不是删除)到指定的目录,比如
/trash/ - 定期清理
/trash/下的文件
但是在具体使用上还是有些区别(推荐方法二)
2.1 方法一:rm 指向mv实现的函数
参考:写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?
过程
-
创建回收站目录:
mkdir /home/.trash -
编写 remove.sh 脚本

-
修改
~/.bashrc, 用我们自建的remove.sh替代rm命令 -
设置 crontab,定期清空垃圾箱
如设置每天 0 点清空垃圾箱:
(1)进入编辑crontab -e(2)写入以下内容:
0 0 * * * rm -rf /home/.trash/*
(3)退出编辑:control x -
执行
source ~/.bashrc,使得.bashrc生效 -
使用举例:
rm ./test_delete
缺点
- 缺点1:
/home/.trash/容易Permission denied

- 缺点2:可能影响到已经在使用
rm命令的脚本
2.2 方法二:新建用mv实现的命令
这里使用新命令rmm来替代系统的rm
过程
- root身份
- 将以下代码写入
/etc/bashrc或者/etc/bash.bashrc中:
#rmm delete
alias rmm=trash
alias rl='ls -a $HOME/.trash'
trash()
{
trash_path="$HOME/.trash"
if [ ! -d $trash_path ]; then
mkdir -p $trash_path
fi
for i in $*; do
if [ "$i" == "-f" -o "$i" == "-rf" ] ;then
continue
fi
STAMP=`date +%Y%m%d-%H:%M:%S`
FileName=`basename $i`
mv $i $trash_path/$FileName"_"$STAMP
done
- source 以上文件,使之立马生效
- 设置定期清理(请看方法一)
使用举例
rmm:移动(删除)
注:后来改为srmrl:显示回收站内信息
(1)root 身份
root@suer-virtual-machine:/etc# rmm /home/suer/test_dir4
root@suer-virtual-machine:/etc# rl
. test_dir2_20210127-10:42:49 test_dir4_20210127-14:24:36
.. test_dir3_20210127-10:46:24
(2)普通用户身份
suer@suer-virtual-machine:~$ rmm test_dir5
suer@suer-virtual-machine:~$ rl
. .. test_dir5_20210127-14:44:59
可能遇到的问题
- 重登或者切换身份命令就不起作用了
可以参考:linux 相关:ubuntu 设置 .bashrc之后 重登不起作用
如果觉得文章可以或者对你有帮助可以点个赞,支持一下博主。

&spm=1001.2101.3001.5002&articleId=113250184&d=1&t=3&u=4fb96b1dbec14daf8041421709a0790c)
1504

被折叠的 条评论
为什么被折叠?



