前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >告别从删库到跑路

告别从删库到跑路

作者头像
PedroQin
发布2019-12-18 11:22:05
6800
发布2019-12-18 11:22:05
举报
文章被收录于专栏:WriteSimpleDemo

在linux 下操作时经常需要用到rm -rf,一招不慎轻者从删库到跑路,重者跑路机会都没有。趁放假,试着结合实际生产环境,实现一下之前一直想的win回收站机制

实现思路

  1. aliasrm取别名,用脚本my_rm.sh代替rm执行
  2. my_rm.sh 调用rm 实现 命令rm的基本功能,如:rm -rf等。同时,将要删除的文件放入定义好的回收站。(实际使用mv 来实现rm的删除加放入文件夹功能)
  3. 新增定时任务,定时清理回收站,防止过量空间占用

代码实现

rm 的实现:my_rm.sh

此脚本实现了

  • 模拟rm命令进行文件以及文件夹的删除动作,同时模拟支持了-r-f等参数
  • 通过变量设置回收站位置
  • 在删除前会使用du命令计算所删除内容占用等总空间大小,可通过设置upper_limit来设定当文件大于多少时直接删除,不放入回收站
代码语言:javascript
复制
#!/bin/bash
###############################################
# Filename    :   my_rm.sh
# Author      :   PedroQin
# Email       :   pedroqin@gmail.com
# Date        :   2019-10-06 14:58:56
# Description :
# Version     :   1.0.0
###############################################

trash_dir_main="/tmp/trash"
trash_dir="$trash_dir_main"/`date +%Y%m%d`
[ ! -d ${trash_dir} ] && mkdir -p ${trash_dir}
upper_limit="$[5000*1024]" ## unit : K

#### for this script env vaiable
RECURSIVE=0
FORCE=0
PROMPT_ONCE=0 # exclusive with FORCE var
PROMPT=0 # exclusive with FORCE var
###
rm_cmd="rm -i"
mv_cmd="mv -i"
###

function confirm ()
{
    local ans=""
    local -i ret=0

    while [ -z "$ans" ]; do
        read -p "$1" ans
        boolean $ans
        ret=$?
        [ $ret -eq 255 ] && ans=""
    done
    #echo "$ans"

    return $ret
}

function boolean()
{
    case "$1" in
        [tT] | [yY] | [yY][eE][sS] | [tT][rR][uU][eE] | L6 | L10 | L12 )
        return 0
        ;;  
        [fF] | [nN] | [nN][oO] | [fF][aA][lL][sS][eE])
        return 1
        ;;  
    esac
    return 255 
}

rm_index=0
while [ ! -z "$1" ];do
    case "$1" in
        -r|--recursive)
        RECURSIVE=1
        ;;  

        -f|--force)
        FORCE=1
        ;;  

        -fr|-rf)
        RECURSIVE=1
        FORCE=1
        ;;  

        -i) 
        PROMPT=1
        ;;  

        -I) 
        PROMPT_ONCE=1
        ;;  

        *)  
        let rm_index++
        dir_file[$rm_index]="$1"
        ;;  

    esac
    shift
done


err_code=0
suffix=`date "+%H%M%S"`
#echo $rm_index
for i in `seq 1 $rm_index`
do
    dir_file_name=${dir_file[$i]}
    #echo $dir_file_name
    if [ ! -d "${dir_file_name}" ]&&[ ! -f "${dir_file_name}" ];then
        echo "[${dir_file_name}] do not exist"
        let err_code++
        continue
    else
        file_name=`basename "${dir_file_name}"`
        # check
        if [ -d "$dir_file_name" -a ${RECURSIVE:-0} -eq 0 ] ;then
            echo cannot remove \'"${dir_file_name}"\' Is a directory
            let err_code++
            continue
        fi
        echo -n "summary size... "
        file_size=`du -sk "${dir_file_name}"|awk '{print $1}'`
        echo "$file_size k"
        # for large file/dir
        if [ "$file_size" -ge "$upper_limit" ];then
            if confirm "The file/dir size is $file_size > $upper_limit(upper_limit) ,delet it without mv to Trash?[Y|N]: " ;then
                rm_para=""
                [ "${RECURSIVE:-0}" -eq 1 ] && rm_para="$rm_para -r"
                [ "${FORCE:-0}" -eq 1 ] && rm_para="$rm_para -f"
                eval $rm_cmd "$rm_para" "${dir_file_name}" || let err_code++
                continue
            else
                continue
            fi
        fi
        if [ "${FORCE:-0}" -eq 0 ];then
            if ! confirm "rm '"${dir_file_name}"'?[Y|N]: " ;then
                continue
            fi
        fi
        target_path=${trash_dir}/"${file_name}"_${suffix}_${RANDOM}
        eval $mv_cmd "${dir_file_name}" ${target_path}
        echo "[${dir_file_name}] delete completed, Trash path: ${target_path}"
    fi
done
exit $err_code

清理回收站:clean_trash.sh

此脚本实现了

  • 查找回收站目录下距最后修改时间大于3天的文件和文件夹,并删除
代码语言:javascript
复制
#!/bin/bash
###############################################
# Filename    :   clear_trash.sh
# Author      :   PedroQin
# Email       :   pedroqin@gmail.com
# Date        :   2019-10-06 18:43:18
# Description :
# Version     :   1.0.0
###############################################

trashdir=/tmp/trash
cd ${trashdir}
# files/dirs which modified 3 days ago ,delet 
find ./ -mtime +3 -print0 |xargs -0 rm -rf {} \;

环境导入

  1. vim ~/.bashrc,修改rm别名
代码语言:javascript
复制
alias rm="bash /root/my_rm.sh" # 修改文件路径
  1. 添加定时任务,vim /etc/crontab 最下一行为添加当任务,此种方法仅用于root用户,所有用户都可以通过crontab -e命令添加,内容同此处方法略有不同,例:00 20 * * * bash /root/clean_trash.sh,相比修改/etc/crontab少了user-name
代码语言:javascript
复制
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
  00 20 *  *  * root bash /root/clean_trash.sh
  1. 不论哪种方式增加计划任务都不用重启cron服务,当然,重启命令也是有的
代码语言:javascript
复制
systemctl restart crond.service

GitHub

https://github.com/pedroqin/shell_script/tree/master/linux_recycle_bin

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WriteSimpleDemo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现思路
  • 代码实现
    • rm 的实现:my_rm.sh
      • 清理回收站:clean_trash.sh
        • 环境导入
        • GitHub
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档