目录
- 前言
- 脚本实现
- 总结
- 注意事项1:mtime 为0的情况
- 注意事项2:/tmp为软链的时候
前言
我们在服务器运行一些服务经常会产生很多临时文件,
而有些临时文件不定期处理很容易就打满了整个磁盘;所以有必要去定期清理,基于这个需求我们就可以搞一个脚本结合crontab
或者服务调度这些来使用;
脚本实现
#!/bin/bash # cleanup_old_files - 清理指定目录中指定天数之前的旧文件 # $1: 目录名称 js# $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 android不存在." 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 "$keywjsord" ]; 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 天之前的旧python文件." 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的时候,也就是我们想模拟当天,不能带修饰符(+/-
);
注意事项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和Mac开发者_云计算OS两个平台,方便本地调试也能测试;
这个参数大体的作用就是递归去找,所以符号链接也能被检索;
不带的情况下默认都是只找硬链接,符号链接就会直接忽略。到此这篇关于shell清理指定目录中指定天数之前的旧文件的文章就介绍到这了,更多相关shell清理指定文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论