linux:重定义rm命令并实现回收站功能
基本原理
linux下的rm命令不像windows,执行了就直接删除,没有后悔药。如果一不小心执行了rm -rf / 那么下次开机怕是都启动不了了,为了避免这种情况,我们需要把rm命令给限制一下,以防止出现误删文件的情况。
原理就是通过.bashrc的alias将rm命令重定义,使rm命令变成调用mv命令将要删除的文件移动到回收站。
重映射rm命令
# 定义回收站目录
trash_path='.trash'
# 判断 $trash_path 定义的文件是否存在,如果不存在,那么就创建 $trash_path.
if [ ! -d $trash_path ]; then
mkdir -p $trash_path
fi
# 定义别名:使用 rm 就调用 trash
alias rm=trash
# 使用 rl 就调用 'ls ~/.trash'
# 如果更改上面的回收站目录这里的目录也需要修改
alias rl='ls ~/.trash'
# 使用 unrm 就调用 restorefile,需要在删除目录的父目录下执行
alias unrm=restorefile
# 使用 rmtrash 就调用 claearteash
alias rmtrash=cleartrash
# 恢复文件的函数
restorefile()
{
mv -i ~/.trash/$@ ./
}
# 删除文件的函数
trash()
{
mv $@ ~/.trash/$@`date +%%%F%%%T`
}
# 清空回收站的函数
cleartrash()
{
read -p "确定要清空回收站吗?[y/n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}
将上面的脚本内容添加到 ‘home/用户名/’ 目录下的 .bashrc 文件中,下次用户连接时会自动加载其配置,或者直接执行 source .bashrc 立即生效
重映射后,rm 文件名 就变成了将文件移动到回收站 ,同时获得删除文件的时间和日期,这样就算回收站中有同名的文件或者文件夹也没关系。
操作回收站的几个命令
另外还添加了几个命令:
rl
查看回收站的内容
unrm
后悔命令,恢复回收站的文件内容。需要在删除目录的父目录下执行,并且要输入正确的文件名参数,不可以不传入参数,不然会把整个回收站都给搬回来。。。
rmtrash
手动清空回收站的命令,执行后删除回收站文件夹下的所有内容,这回真的没有后悔药了。
因为 重映射了rm命令,所以rm -rf就不再可用了,如果仍需要调用rm命令,需要输入 /bin/rm {参数} 进行绝对调用,仍然想要删库跑路的可以用这种手法。
当然这样删除文件后文件只是会移动到回收站,如果懒得手动清空,可以写一个定时清理脚本,添加到crontab中定时执行
定时清空垃圾箱.trash, 通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本
编辑crontab文件中条目: crontab -e
添加: 0 0 * * * rm -rf ~/.trash/*