BlackChen'site

rm -rf 需永远警惕

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可以显示提示

realrm 真正的删除(原rm)


如果想要定时清空回收站,可使用定时器

  • 添加用户的定时器crontab -e 打开定时器编辑文件,添加如下代码

0 0 */2 * * trash_time_clean;

每两天的0时0分执行 trash_time_clean;删除两天以前的文件

评论