当前位置: 首页 > article >正文

shell:清理指定目录中指定天数之前的旧文件

前言

我们在服务器运行一些服务经常会产生很多临时文件,
而有些临时文件不定期处理很容易就打满了整个磁盘;
所以有必要去定期清理,基于这个需求我们就可以搞一个脚本结合crontab或者服务调度这些来使用;

脚本实现

#!/bin/bash

# cleanup_old_files - 清理指定目录中指定天数之前的旧文件
# $1: 目录名称
# $2: 天数
# $3: (可选)关键字,用于匹配文件名

function cleanup_old_files() {
    local dir="$1"     # 目录名称
    local days="$2"    # 天数
    local keyword="$3" # 匹配文件名的关键字

    # 参数有效性检查
    if [ -z "$dir" ]; then
        echo "错误:目录参数为空."
        return 1
    fi

    if [ ! -d "$dir" ]; then
        echo "错误:目录 $dir 不存在."
        return 1
    fi

    if ! [[ "$days" =~ ^[0-9]+$ ]]; then
        echo "错误:天数参数无效."
        return 1
    fi

    # 如果未指定天数,则默认为当天
    if [ -z "$days" ]; then
        days=0
    fi

    # 构建查找命令,根据 $days 的值进行区分
    if [ "$days" -eq 0 ]; then
        find_cmd="find -L \"$dir\" -type d -o -type f -mtime 0"
    else
        find_cmd="find -L \"$dir\" -type d -o -type f -mtime +$days"
    fi

    # 如果指定了关键字,则加入查找命令中
    if [ -n "$keyword" ]; then
        find_cmd+=" -name \"*$keyword*\""
    fi

    # 打印完整命令
    echo "执行命令: $find_cmd"

    # 执行查找并删除文件
    if [ "$days" -eq 0 ]; then
        echo "正在清理目录 $dir 中当天创建的$(if [ -n "$keyword" ]; then echo "包含关键字 $keyword 的 "; else echo "所有 "; fi)文件..."
    else
        echo "正在清理目录 $dir$days 天之前创建的$(if [ -n "$keyword" ]; then echo "包含关键字 $keyword 的 "; else echo "所有 "; fi)文件..."
    fi

    # 通过-exec rm -rf {} + 删除查找到的文件
    if eval "$find_cmd -exec rm -v -rf {} +" >/dev/null; then
        if [ "$days" -eq 0 ]; then
            echo "已删除当天的旧文件."
        else
            echo "已删除 $days 天之前的旧文件."
        fi
    else
        echo "删除失败."
        return 1
    fi
}

# 示例用法
# cleanup_old_files "/path/to/directory" 30 "log"
# cleanup_old_files "/path/to/directory" 0 "log"

总结

注意事项1:mtime 为0的情况

值得注意的是,mtime为0的时候,也就是我们想模拟当天,不能带修饰符(+/-);
在Debian和MacOS执行的表现是没有报错,但是没有任何操作,所以代码里面做了一个区分;

注意事项2:/tmp为软链的时候

若是find命令想要检索到里面的内容,记得带-L,否则没法检索出任何东西;

# 在mac下tmp是一个软链链接到/private/tmp
ls -l /tmp
lrwxr-xr-x@ 1 root  wheel  11 Dec  2 19:37 /tmp -> private/tmp

带上-L之后就能兼容Linux和MacOS两个平台,方便本地调试也能测试;

这个参数大体的作用就是递归去找,所以符号链接也能被检索;
不带的情况下默认都是只找硬链接,符号链接就会直接忽略。

有不对之处请留言,谢谢阅读!


http://www.kler.cn/a/13623.html

相关文章:

  • 【学习笔记】从MySQL快速入门 PostgreSQL
  • 美国肝素钠专用树脂,医药肝素钠提取工艺专用树脂
  • 三谈ChatGPT(ChatGPT可以解决问题的90%)
  • OpenCV 图像处理学习手册:6~7
  • 液压轴位置闭环控制(比例伺服阀应用)
  • 不知道玩什么游戏的你看过来
  • 功率MOS管烧毁,有这些原因
  • 大型体检管理系统源码:适用于大中型医院或独立体检中心
  • C/C++每日一练(20230419)
  • Elasticsearch
  • 格式工厂将视频导出Maya需要的图像序列帧
  • 我的第一台电脑------计算机类专业学生购置电脑的一些个人心得
  • 如何用AI生成《ios客户端学习笔记(一):Swift学习路径》
  • VUE入门
  • VMware vSphere 8.0 Update 1 正式版发布 - 企业级工作负载平台
  • 【设计模式】Java 的三种代理模式
  • 智加科技与舍弗勒签订商用车先进转向系统量产合作协议,将率先量产行业首个正向开发的智能重卡冗余转向
  • 如何在硬盘上恢复已经删除的照片?
  • 测试老鸟总结,性能测试如何做?常见异常有哪些?解决方法...
  • 300元的蓝牙耳机什么牌子好?300内无线蓝牙耳机推荐