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

 更新时间:2023年05月06日 10:39:32   作者:CRPER  
本文主要介绍了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两个平台,方便本地调试也能测试;

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

到此这篇关于shell清理指定目录中指定天数之前的旧文件的文章就介绍到这了,更多相关shell清理指定文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过shell进行数学运算的多种方式

    通过shell进行数学运算的多种方式

    这篇文章主要介绍了通过shell进行数学运算的多种方式、有let命令 、$[]形式、expr命令等,需要的朋友可以参考下
    2014-03-03
  • 详解Shell 命令行批量处理图片文件名的实例

    详解Shell 命令行批量处理图片文件名的实例

    这篇文章主要介绍了详解Shell 命令行批量处理图片文件名的实例的相关资料,这里提供实例及实现方法的分析,需要的朋友可以参考下
    2017-08-08
  • 自动生成linux网卡配置脚本分享

    自动生成linux网卡配置脚本分享

    这篇文章主要介绍了自动生成linux网卡配置的脚本,因为Linux虚拟机在复制时候网卡信息会更新,所以导致需要重新配置网卡。本脚本功能,第一次添加网卡后,启动虚拟机,然后运行脚本(可以写在启动脚步中),然后根据ifconfig -a 的信息来创建ifcfg-ethX的配置文件或者修改对应的ifcfg-ethX的mac
    2014-03-03
  • Shell执行脚本并输出日志文件的方法

    Shell执行脚本并输出日志文件的方法

    这篇文章主要介绍了Shell执行脚本并输出日志文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Shell创建用户并生成随机密码脚本分享

    Shell创建用户并生成随机密码脚本分享

    这篇文章主要介绍了Shell创建用户并生成随机密码脚本分享,本文生成的随机密码会比较复杂和实用,需要的朋友可以参考下
    2014-12-12
  • 使用shell来发tcp包的方法

    使用shell来发tcp包的方法

    今天小编就为大家分享一篇关于使用shell来发tcp包的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • linux下socket编程常用头文件(推荐)

    linux下socket编程常用头文件(推荐)

    这篇文章主要介绍了linux下socket编程常用头文件,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-10-10
  • Git中需要熟记的命令小结

    Git中需要熟记的命令小结

    这篇文章总结了Git中必须记住的一些命令,,合理使用这些命令可以大大提升应用Git的效率。有需要的可以参考学习。
    2016-08-08
  • 实现释放CentOS系统内存的Shell脚本分享

    实现释放CentOS系统内存的Shell脚本分享

    这篇文章主要介绍了实现释放CentOS系统内存的Shell脚本分享,本文对一些小内存的VPS特别有用,需要的朋友可以参考下
    2014-12-12
  • Linux 中纠正拼写错误的Bash 命令方法

    Linux 中纠正拼写错误的Bash 命令方法

    这篇文章主要介绍了Linux 中纠正拼写错误Bash 命令的方法,需要的朋友可以参考下
    2018-03-03

最新评论