如何通过Shell脚本删除文件名中日期超30天的日志文件?
按文件名中的日期删除超过30天的日志文件
要实现按文件名内嵌的日期删除距今超过30天的文件,不能依赖文件修改时间,需要提取文件名中的日期进行计算。以下是具体的bash脚本解决方案:
解决方案脚本
#!/bin/bash TARGET_DIR="/path/to/files" # 遍历目标目录下符合命名规则的日志文件 for file in "$TARGET_DIR"/*_*_*_*.log; do # 处理没有匹配到文件的情况 [ -e "$file" ] || continue # 从文件名中提取日期部分(格式:dd_mm_yyyy) date_str=$(basename "$file" .log | awk -F '_' '{print $(NF-2)"_"$(NF-1)"_"$NF)}') # 将日期转换为yyyy-mm-dd格式,确保date命令可识别 formatted_date=$(echo "$date_str" | awk -F '_' '{print $3"-"$2"-"$1}') # 跳过日期格式无效的文件 if ! date -d "$formatted_date" >/dev/null 2>&1; then echo "格式错误,跳过文件:$file" continue fi # 计算该日期与当前日期的天数差 days_diff=$(( ($(date +%s) - $(date -d "$formatted_date" +%s)) / 86400 )) # 若天数差超过30天则删除文件(先echo测试,确认无误后启用rm) if [ "$days_diff" -gt 30 ]; then echo "将删除:$file" # rm "$file" # 取消注释此行执行实际删除 fi done
脚本说明
- 指定目标目录:把
TARGET_DIR替换为你的日志文件实际路径 - 提取日期:通过
basename和awk拆分文件名,取倒数三个下划线分隔的字段(适配前缀含下划线的文件名) - 日期格式转换:将
dd_mm_yyyy转为yyyy-mm-dd,这是date命令支持的标准格式 - 有效性检查:过滤掉日期格式错误的文件,避免报错
- 天数计算:通过时间戳差值计算天数,一天等于86400秒
- 安全测试:先通过
echo预览要删除的文件,确认无误后再取消rm的注释
注意事项
如果你的文件名日期格式是mm_dd_yyyy(月_日_年),需要修改格式转换的awk命令,把print $3"-"$2"-"$1改成print $3"-"$1"-"$2。
内容的提问来源于stack exchange,提问作者Pratik Dangore
相关产品推荐
相关产品推荐

