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

读取stage.txt筛选10分钟以上旧文件时输出异常,求修正方案

问题分析与修正方案

问题根源

  • 使用echo $datetoday > $email时,每次循环都会清空目标文件,最终仅保留最后一个符合条件的条目(因为每次覆盖)。
  • 使用echo $datetoday >> $email时,每找到一个符合条件的文件就重复输出日期,导致日期多次出现。

修正思路

  1. 把日期输出逻辑移到循环外,只写入一次到目标文件(先清空再写入)。
  2. 循环内仅对符合条件的文件条目执行追加操作。
  3. 补充无符合条件文件时的提示处理。

修正后的脚本

## 当前时间设为15:40,也可通过命令动态获取:timeHH=$(date +%H),timeMM=$(date +%M)
timeHH=15
timeMM=40
diffstg="10"
email="/path/to/your/email/file" # 替换为实际文件路径
datetoday=$(date)

# 先清空文件并写入日期(仅执行一次)
echo "$datetoday" > "$email"
# 标记是否找到符合条件的文件
found=0

while IFS= read -r line
do
    # 提取文件时间并转为数字格式(如15:20转为1520)
    timeminstg=$(echo "$line" | awk '{print $8}' | sed 's/://g')
    # 计算时间差(转为十进制避免八进制解析问题)
    current_time_num=$((10#$timeHH$timeMM))
    file_time_num=$((10#$timeminstg))
    timediffstg=$((current_time_num - file_time_num))

    if [ "$timediffstg" -ge "$diffstg" ]
    then
        echo "$line" >> "$email"
        found=1
    fi
done < /tmp/stage.txt

# 无符合条件文件时追加提示
if [ "$found" -eq 0 ]
then
    echo "Nothing older than 10 mins" >> "$email"
fi

关键说明

  • 日期仅在循环启动前写入一次,彻底解决重复或覆盖问题。
  • 新增found变量跟踪结果状态,统一处理无匹配文件的提示。
  • 变量引用全部加双引号,避免空格等特殊字符引发的语法错误。
  • 时间计算逻辑拆分后更清晰,避免隐式转换导致的错误。

验证结果

执行修正脚本后,$email文件内容将与预期完全一致:

Sun Apr  9 15:40:10 CEST 2023
-rw-r--r-- 1 admin admin 3046 Apr 9 15:20 /opt/1.txt
-rw-r--r-- 1 admin admin 3046 Apr 9 15:20 /opt/2.txt
-rw-r--r-- 1 admin admin 3046 Apr 9 15:20 /opt/3.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:41