如何从文件名提取日期修正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
相关产品推荐
相关产品推荐

