You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从文件名提取日期修正Bash脚本以删除Linux上两周前文件

解决Bash脚本中日期识别错误的问题

你的脚本核心问题是日期格式解析失败:从文件名提取的17-07-2023是日-月-年格式,date命令默认可能无法正确识别这种格式,导致file_date变量获取失败,进而触发判断逻辑错误。

以下是修正后的脚本,同时添加了格式校验和错误处理,避免非目标文件干扰:

#!/bin/bash

backup_folder="/dev/backupsTest"  

# 计算两周前的时间戳(秒)
two_weeks_ago=$(date -d "2 weeks ago" +%s)

# 遍历目标文件夹下的文件
for file in "$backup_folder"/*; do
    # 跳过非文件对象(比如文件夹)
    [[ -f "$file" ]] || continue

    filename=$(basename "$file")
    # 用正则提取日期部分(匹配类似17-07-2023的格式)
    if [[ "$filename" =~ ^.+_([0-9]{2}-[0-9]{2}-[0-9]{4})__.+\.dump$ ]]; then
        date_part=${BASH_REMATCH[1]}
        
        # 将日-月-年格式转换为date可识别的格式(月/日/年),并转为时间戳
        formatted_date=$(echo "$date_part" | sed 's/\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{4\}\)/\2\/\1\/\3/')
        file_date=$(date -d "$formatted_date" +%s 2>/dev/null)
        
        # 检查日期解析是否成功,以及是否满足删除条件
        if [[ -n "$file_date" && $file_date -lt $two_weeks_ago ]]; then
            # 排除日期以05、15、25开头的文件
            if ! [[ "${date_part:0:2}" =~ ^(05|15|25)$ ]]; then
                rm "$file"
                echo "已删除文件: $file"
            fi
        fi
    else
        # 跳过不符合命名规则的文件
        echo "跳过非目标格式文件: $filename"
    fi
done

关键修正点说明:

  • 正则提取日期:用[[ "$filename" =~ ... ]]精准匹配文件名格式,确保只处理符合xxx_dd-mm-yyyy__hh-mm.dump的文件,避免无效文件干扰。
  • 强制日期格式转换:通过sed将dd-mm-yyyy转为mm/dd/yyyy,让date命令能100%正确识别,避免系统locale差异导致的解析错误。
  • 错误处理:添加2>/dev/null屏蔽date解析失败的错误信息,并用-n "$file_date"检查解析是否成功,防止脚本因无效日期中断。
  • 非文件跳过:用[[ -f "$file" ]]跳过文件夹等非文件对象。

内容的提问来源于stack exchange,提问作者medstoun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:12:53