Shell脚本开发需求:校验文件名中YYYYMMDD日期的合规性
Shell脚本实现思路与具体方案
核心逻辑拆解
- 先计算当前日期、次日、第三日的
YYYYMMDD格式日期(对应每周五、周六、周日) - 遍历目标文件,提取每个文件名的日期前缀
- 校验日期是否属于允许的范围,只要有不符合的文件立即终止脚本并返回失败
- 额外校验文件数量是否为预期的3个
具体脚本实现
#!/bin/bash # 兼容GNU/Linux和BSD/macOS的日期计算 if date --version >/dev/null 2>&1; then CURRENT_DATE=$(date +%Y%m%d) NEXT_DAY=$(date -d "+1 day" +%Y%m%d) DAY_AFTER_NEXT=$(date -d "+2 days" +%Y%m%d) else CURRENT_DATE=$(date +%Y%m%d) NEXT_DAY=$(date -v+1d +%Y%m%d) DAY_AFTER_NEXT=$(date -v+2d +%Y%m%d) fi # 定义允许的日期集合 ALLOWED_DATES=("$CURRENT_DATE" "$NEXT_DAY" "$DAY_AFTER_NEXT") # 遍历所有_abc.txt文件 for file in *_abc.txt; do # 跳过非文件(无匹配文件时避免报错) [ -f "$file" ] || continue # 提取文件名前8位的日期部分 FILE_DATE=${file:0:8} # 校验日期格式是否为8位数字 if ! [[ "$FILE_DATE" =~ ^[0-9]{8}$ ]]; then echo "ERROR: 文件 $file 的日期格式不符合YYYYMMDD要求" exit 1 fi # 校验日期是否为有效日期(避免20220230这类非法日期) if ! date -d "$FILE_DATE" +%Y%m%d >/dev/null 2>&1 2>/dev/null; then echo "ERROR: 文件 $file 的日期 $FILE_DATE 是无效日期" exit 1 fi # 校验日期是否在允许的范围内 if [[ ! " ${ALLOWED_DATES[@]} " =~ " $FILE_DATE " ]]; then if [ "$FILE_DATE" -lt "$CURRENT_DATE" ] || [ "$FILE_DATE" -gt "$DAY_AFTER_NEXT" ]; then echo "ERROR: 文件 $file 的日期 $FILE_DATE 超出允许范围($CURRENT_DATE ~ $DAY_AFTER_NEXT)" else echo "ERROR: 文件 $file 的日期 $FILE_DATE 不在预期的三个日期列表中" fi exit 1 fi done # 校验文件数量是否为3个 FILE_COUNT=$(ls -1 *_abc.txt 2>/dev/null | wc -l) if [ "$FILE_COUNT" -ne 3 ]; then echo "ERROR: 预期收到3个文件,实际收到 $FILE_COUNT 个" exit 1 fi echo "所有文件校验通过,开始执行后续操作..." # 在这里添加后续需要执行的业务命令
关键注意事项
- 如果文件不在脚本执行目录,需修改遍历路径(比如
/path/to/files/*_abc.txt) - 可根据需求调整错误输出的方式(比如写入日志文件)
- 确保脚本执行用户有目标文件的读取权限
- 若需适配其他日期规则,只需修改
ALLOWED_DATES的生成逻辑
内容的提问来源于stack exchange,提问作者nj_man_08872
相关产品推荐
相关产品推荐

