告别从删库到跑路,linux回收站实现

在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来设定当文件大于多少时直接删除,不放入回收站
#!/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天当文件和文件夹,并删除
#!/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别名
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
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服务,当然,重启命令也是有的
systemctl restart crond.service

GitHub

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值