在linux在rm的使用频率很高,误删,错删的情况自然避免不了,本人就曾经在错误的目录下使用了 rm -rf ./* 命令 ,花了半天才把环境重新搭建好...... 所以建立一种可回退的机制就很有必要。
看了网上的介绍,整体的实现方式分为两种:
1.利用github上的项目 使用一个新的命令 trash去删除文件。
2.改写rm命令,利用mv命令移动文件or文件夹到指定的文件夹下,再定时删除。
很遗憾我看了几篇文章的git地址都下载不了,只能利用第二种方法自己实现。
利用mv命令也有两种实现方式:
1.改变rm的调用方式,让其不再调用/bin/rm 命令而是转而调用利用mv实现的删除函数
2.新建一个命令。
考虑到本身环境的其他脚本已经调用rm命令,可能会导致其他脚本运行出错,加上工作的环境多人在使用。这里我采用了方式2,新建一个rmm命令,避免不必要的麻烦。(真正的工作环境中推荐这种方式)
实现rmm命令的方式也有两种方式:
1.在根目录下创建一个 .myrm.sh 然后 alias rmm='sh /root/.myrm.sh'
2.将移动文件夹的函数trash()直接写入/etc/bashrc中,然后 alias rmm=trash
考虑到其他用户调用/root/.myrm.sh存在权限问题,这里值得一提的是就算采用第一方式 再chmod 777 /root/.myrm.sh也会存在权限问题。具体原因未知。抛开第一种的权限问题,第二种方法也更加简单明了。
综合网上的文章,我的具体实现方式如下:
#rm回收机制机制
1.切换root用户
2.vi /etc/bashrc #在文件末尾加添加下方代码 --写入 /etc/bashrc 而不写入~/.bashrc的原因是让rmm命令在此机器的每个用户都生效
3.source /etc/bashrc --让/etc/bashrc 生效
4.设置crontab定时任务,利用rm去清空垃圾桶中超过三天的文件 --eg:find /home/用户/.trash/* -ctime +3 |xargs rm -rf 推荐全部写入root用户的定时任务中
5.关闭已经打开的xshell窗口,重新打开
#需要在文件末尾添加的内容如下
#rmm删除文件
alias rmm=trash
#显示垃圾桶内的文件
alias rl=' ls -a $HOME/.trash'
#使用rmtrash清空回收站 这里注释掉的原因是我会设置定时任务去清空 有需要的同学可以放开
#alias rmtrash=cleartrash
trash()
{
#采用$HOME是为了在每个用户的家目录下都新增一个垃圾桶,让便查看和操作,避免root权限问题
trash_path="$HOME/.trash"
if [ ! -d $trash_path ]; then
mkdir -p $trash_path
fi
for i in $*; do
#避免习惯性使用rm 带-f -rf参数
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
}
cleartrash()
{
read -p "确定要清空回收站吗?[y/n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}
效果展示:
root用户:
一般用户:
如果及时发现删除文件了,且未超过预置的存放时间(我这里定时任务设置的三天),立即cd ~/.trash 将垃圾箱中的文件挽救出来。希望对读者有用。