读取stage.txt筛选10分钟以上旧文件时输出异常,求修正方案
问题分析与修正方案
问题根源
- 使用
echo $datetoday > $email时,每次循环都会清空目标文件,最终仅保留最后一个符合条件的条目(因为每次覆盖)。 - 使用
echo $datetoday >> $email时,每找到一个符合条件的文件就重复输出日期,导致日期多次出现。
修正思路
- 把日期输出逻辑移到循环外,只写入一次到目标文件(先清空再写入)。
- 循环内仅对符合条件的文件条目执行追加操作。
- 补充无符合条件文件时的提示处理。
修正后的脚本
## 当前时间设为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
相关产品推荐
相关产品推荐

