【.sh】按文件目录批量删除 指定名称的全部文件,仅保留最新一个

按目录及名称关键字 批量删除文件,仅保留最新文件

复制代码
#!/bin/bash
###############################################################################
# Time:2022-1-5                                                              #
# Describe:多个目录下根据关键字查询并清理目录下的过期文件,仅保留最新文件    #
###############################################################################
#### 【注意】##################################################################
#  1. 路径命名规则:cls_list中的名称_path                                     #
#  2. 关键字命名规则:cls_list中的名称_keyword                                #
###############################################################################
# 配置内容;
cls_list="test_a test_b"

# path及keyword
test_a_path="/home/appuser/clsSpace/test/aaa/"
test_a_keyword="a.log"
# path及keyword
test_b_path="/home/appuser/clsSpace/test/zzz/"
test_b_keyword="b.log z.log"



## 人工确认是否需要清理数据,不区分大小写
#read -p "请确认是否进行相关路径下的数据清理(y/n):" cls

# 无需人工确认,直接清理
cls="y"
if [ "$cls" = "y" ] || [ "$cls" = "Y" ];then
    ## 开始执行脚本
    begin_d=`date +%Y-%m-%d_%H:%M:%S`
    echo ""
    echo "================================== 执行开始时间:$begin_d =================================="
    echo ""
    echo " --------------------------------------------------------------------------------------------"

    # 遍历配置内容(按目录循环)
    for i in ${cls_list};do
        #echo "  <<<<<<<<<<<<<<<<<<<<<<<<<< 目 录 分 隔 线 >>>>>>>>>>>>>>>>>>>>>>>>>>  "
        # 需要删除的路径
        cls_path=${i}_path
        # 获取删除前 目录下文件总数
        rm_begin=`ls ${!cls_path} |wc -l`
        # 需要删除的文件
        cls_keyword=${i}_keyword
        echo ""
        echo "  删除路径:${!cls_path}"
        echo "  删除前 ${!cls_path}目录下文件总数:${rm_begin}"

        # 遍历keyword(目录下按关键字循环)
        for kw in ${!cls_keyword};do
            echo ""
            #echo "  >>>>>>>>>>>>>>>>>>>>>>>>>> 文 件 分 割 线 <<<<<<<<<<<<<<<<<<<<<<<<<<  "
            echo "  ## 开始删除名称包含【${kw}】的文件 ##"
            # 根据关键字查询目录下的文件
            keyword_filename=`ls -t ${!cls_path} |grep ${kw}`
            # 根据关键字获取目录下最新的文件
            newFileName=`ls -lt ${!cls_path} |grep ${kw} |head -n 1 |awk '{print $9}'`
            # 循环获取根据关键字查询到的file
            for file in ${keyword_filename};do
                # 获取文件时间戳
                file_date=$(date +%s -r ${!cls_path}${file})
                ## 判断文件是否为需要保留的文件
                ## echo "文件名:${file} --> 最新文件:$newFileName"
                if [ "${file}" = "${newFileName}" ];then
                    ## 是最新文件,保留
                    echo ""
                    echo "    ::: 最新文件保留不删除:${file} --> 时间戳:${file_date} :::"
                    echo ""
                else
                    ## 不是最新文件,删除
                    echo "        删除文件:${file} --> 时间戳: ${file_date}"
                    #rm -rf ${!cls_path}${file}
                fi
            done
        done
        # 获取删除后 目录下文件总数
        rm_end=`ls ${!cls_path} |wc -l`
        rm_nums=$[${rm_begin}-${rm_end}]
        echo ""
        echo "  删除后 ${!cls_path}目录下文件总数:${rm_end},共删除文件:${rm_nums} 个"
        echo ""
        echo " --------------------------------------------------------------------------------------------"
        echo ""
    done
    ## 结束时间
    #echo ""
    end_d=`date +%Y-%m-%d_%H:%M:%S`
    echo "================================== 执行结束时间:$end_d =================================="
    echo ""
        
else
    echo ""
    echo "未执行脚本,已退出"
    echo ""
fi
sh
复制代码

 

posted @   Phoenixy  阅读(520)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示