rm -rf 需永远警惕
今日在测试环境修改代码,测试的时候,删除旧的日志文件(方便查看当前最新生成的日志),由于多个终端的切换,导致没有关注文件目录,直接在src目录下执行rm -rf *
!!!,
真是一个悲惨的教训,上周的代码没有备份,也没有提交版本库........
警惕 :
- 要时刻保持警惕,在执行一些无法逆转,容易产生不可预估的后果的命令时,一定要再三确认.
- 要随时保持备份,保持第二方案,做好最坏的打算.
解决方案:
在总结一番后,决定写一个类似回收站一样的脚本来防止类似事情的发生.
- 编写shell 脚本,使用
mv
命令代替rm
命令。
添加以下代码到~/.bashrc
中
alias rm='trash'
alias rl='trash_ls'
alias rr='trash_rm'
alias rg='trash_log'
alias realrm='/bin/rm'
#-------回收站
TrashHome="${HOME}/.data/"
TrashDir="${TrashHome}rubbish/"
TrashLog="${TrashHome}Log"
trash()
{
mkdir -p ${TrashDir}
#显示帮助提示
if [[ $1 = "" ]];then
echo "[ rm ] ---- 'remove' File Or Directory"
echo " eg : rm filename"
echo " eg : rm filename1 filename2 dirname ..."
echo "[ rl ] : List trash directory file"
echo "[ rr ] : Clean trash directory"
echo "[ rg ] : Get Trash Log"
echo "[ realrm ] : original rm!!"
echo ""
echo "This [ rm ] is [ mv ]!!"
echo "The trash directory is [ ${TrashDir} ]"
echo "The trash Log is [ ${TrashLog} ]"
fi
#循环 ‘删除’ 传入文件
#命令后面跟 -- 是参数结束标记
for i in $*
do
Dir=`pwd`
DATETIME=`date +%Y%m%d%H%M%S`
fileName=`basename -- $i`
filesize=`du -sch -- $i | awk 'END{print $1}'`
mv -- $i ${TrashDir}/${fileName}.${DATETIME}
#添加日志信息
if [[ $? -eq 0 ]];then
if [[ -d ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-d ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Success " >> ${TrashLog}
elif [[ -f ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-f ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Success " >> ${TrashLog}
else
echo "-- ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Success " >> ${TrashLog}
fi
else
if [[ -f ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-f ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Failure" >> ${TrashLog}
elif [[ -d ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-d ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Failure" >> ${TrashLog}
else
echo "-- ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Failure" >> ${TrashLog}
fi
fi
done
}
#展示回收站内容
trash_ls()
{
#ls -lt $TrashDir
ls -lt --color $TrashDir| sort -s -k 1,1
trashsize=`du -chs ${TrashDir} | awk 'END{print $1}'`
echo "回收站总大小: ${trashsize}"
}
#清空回收站内容
trash_rm()
{
read -p "确定清空回收站吗(同时会删除回收站日志)?(y/n)" action
if [ $action = "y" ];then
/bin/rm -rf ${TrashDir}*
echo "">${TrashLog}
elif [ $action = "Y" ];then
/bin/rm -rf ${TrashDir}
echo "">${TrashLog}
fi
}
#打印回收站日志
trash_log()
{
clear
cat ${TrashLog}| awk 'BEGIN{printf "%-6s %-15s %-30s %-10s %-15s %-10s\n","类型","文件名","原文件路径","文件大小","日期","删除状态";
printf "---------------------------------------------------------------------------------------------------------\n"}
{ printf "%-*s %-*s %-*s %-*s %-*s %-*s\n",6,$1,15,$2,40,$3,10,$4,20,$5,10,$6}
END {printf "---------------------------------------------------------------------------------------------------------\n"}
'
}
trash_time_clean()
{
#定时删除回收站中的文件,定时器执行crontab
#定时删除两天以上的文件
find ${TrashDir} -maxdepth 1 -mtime +2 -exec rm -rf {} \;
}
#--------end 回收站
保存退出后执行 source .bashrc
,使修改立即生效
下面是回收站命令:
直接执行rm
可以显示提示
rm 执行的是trash函数
rg 打印删除日志
rl 显示回收站内容
rr 清空回收站
realrm 真正的删除(原rm)
如果想要定时清空回收站,可使用定时器
- 添加用户的定时器
crontab -e
打开定时器编辑文件,添加如下代码
0 0 */2 * * trash_time_clean;
每两天的0时0分执行 trash_time_clean;
删除两天以前的文件.
谢谢大家.