Bash脚本按文件名删旧文件报value too great for base错误如何解决
错误产生原因
- 运算符使用错误:你在
[[ ]]中使用了-gt算术比较运算符,这类运算符仅支持整数比较。Bash执行算术比较时会尝试将左右两侧的变量解析为十进制整数,而文件名中的日期格式为YYYY_MM_DD,包含下划线非数字字符,无法被解析为合法整数,因此触发“value too great for base”报错。 - 日期格式不匹配:你用
date +%F生成的8天前日期格式为YYYY-MM-DD,和文件名的YYYY_MM_DD分隔符不一致,就算比较不报错也无法正确匹配。 - 删除逻辑写反:你当前的判断是大于8天前日期的文件执行删除,和需求“删除8天前的旧文件”完全相反,会误删新文件。
可行解决方案
以下两种方案均可直接使用:
方案1:统一日期格式后做字符串比较
YYYYMMDD格式的日期字符串字典序和时间顺序完全一致,直接用字符串比较即可实现需求,性能更高:
#!/bin/bash # 生成8天前的YYYYMMDD格式纯数字日期 f8days=$(date +%Y%m%d --date="-8 days") for file in 20*.txt do # 提取文件名中的日期部分,去掉后缀和下划线,转成YYYYMMDD格式 file_date=${file%.txt} file_date=${file_date//_/} # 日期小于等于8天前的旧文件执行删除 if [[ "$file_date" -le "$f8days" ]] then rm -rf "$file" fi done
方案2:转时间戳做算术比较
如果需要兼容更复杂的日期格式,可将所有日期统一转成秒级时间戳后再做算术比较,兼容性更强:
#!/bin/bash # 生成8天前的秒级时间戳 f8days_ts=$(date +%s --date="-8 days") for file in 20*.txt do # 提取文件名中的日期部分,转成Bash可识别的YYYY-MM-DD格式后生成时间戳 file_date_str=${file%.txt} file_date_str=${file_date_str//_/-} file_ts=$(date +%s --date="$file_date_str") # 时间戳小于等于8天前的旧文件执行删除 if [[ "$file_ts" -le "$f8days_ts" ]] then rm -rf "$file" fi done
内容的提问来源于stack exchange,提问作者Ayush Kapil
相关产品推荐
相关产品推荐

