라 이브 러 리 삭제 에서 활주로 까지 작별 인 사 를 하고 Liux 휴지통 이 실현 되 었 습 니 다.

18124 단어 linuxshell
Liux 에서 작업 할 때 자주 사용 해 야 합 니 다 rm -rf. 조심 하지 않 으 면 가 벼 운 사람 은 라 이브 러 리 를 삭제 하 는 것 부터 도망 가 는 것 까지 무 거 운 사람 은 도망 갈 기회 가 없습니다.방학 을 틈 타 실제 생산 환경 과 결합 하여 이전에 생각 했 던 win 휴지통 체 제 를 실현 해 보 세 요.
사고의 방향 을 실현 하 다.
  • alias 에 게 별명 을 지어 주 고 rm 대신 스 크 립 트 my_rm.sh 로 실행
  • rm 호출 my_rm.sh 명령 rm 의 기본 기능, 예 를 들 어 rm 등 이다.또한 삭제 할 파일 을 정 의 된 휴지통 에 넣 습 니 다.(실제 사용 rm -rf 으로 mv 휴지통 에 넣 기 기능 추가)
  • 정시 임 무 를 추가 하고 정시 에 회수 소 를 청소 하 며 과도 한 공간 점용 을 방지 합 니 다
  • 코드 구현
    rm 의 실현: myrm.sh
    이 스 크 립 트 가 구현 되 었 습 니 다.
  • 아 날로 그 rm 명령 으로 파일 및 폴 더 삭제 동작 을 진행 하 는 동시에 아 날로 그 지원 rm, -r 등 매개 변수
  • 변 수 를 통 해 휴지통 위 치 를 설정 합 니 다
  • 삭제 하기 전에 -f 명령 을 사용 하여 삭 제 된 내용 의 점용 등 총 공간 크기 를 계산 합 니 다. 설정 du 을 통 해 파일 이 얼마 이상 일 때 직접 삭제 하고 휴지통 에 넣 지 않 습 니 다
  • .
    #!/bin/bash
    ###############################################
    # Filename    :   my_rm.sh
    # Author      :   PedroQin
    # Email       :   [email protected]
    # 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
    

    휴지통 청소: cleantrash.sh
    이 스 크 립 트 가 구현 되 었 습 니 다.
  • 휴지통 디 렉 터 리 의 마지막 수정 시간 이 3 일 이상 파일 과 폴 더 를 찾 고 삭제
  • #!/bin/bash
    ###############################################
    # Filename    :   clear_trash.sh
    # Author      :   PedroQin
    # Email       :   [email protected]
    # 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 {} \;
    

    환경 가 져 오기
  • upper_limit, 별명 수정 vim ~/.bashrc
    alias rm="bash /root/my_rm.sh" #        
    
  • 정시 작업 을 추가 합 니 다. rm 다음 행위 에 추 가 된 작업 입 니 다. 이 방법 은 루트 사용자 에 게 만 사 용 됩 니 다. 모든 사용자 가 vim /etc/crontab 명령 을 통 해 추가 할 수 있 습 니 다. 내용 은 이 처방 법 과 약간 다 릅 니 다. 예: crontab -e 수정 00 20 * * * bash /root/clean_trash.sh 보다 적 습 니 다 /etc/crontab
  • 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
    
  • 어떤 방식 으로 든 계획 임 무 를 추가 할 때 cron 서 비 스 를 다시 시작 하지 않 아 도 됩 니 다. 물론 재 부팅 명령 도 있 습 니 다
  • systemctl restart crond.service
    

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

    좋은 웹페이지 즐겨찾기