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

UNIX Shell脚本中基于gsutil提取日期的比较逻辑失效求助

问题描述

尝试从gsutil ls -l命令输出中提取文件日期,与指定日期范围(2024-05-01至2025-07-09)比较后执行文件复制逻辑。但实际运行时,即使文件日期(2024-10-11)处于范围内,仍提示“跳过该文件,因日期超出范围”,未执行复制操作。

使用的脚本代码:

lstr=$(gsutil ls -l gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml)
prcs_date=$(echo ${lstr} | awk '{print $2}' | awk -F"T" '{print $1}')
date_frmt=$(date -d "$prcs_date" +"%Y-%m-%d")
cmpr_date=$(date -d "2024-05-01" +"%Y-%m-%d")
high_date=$(date -d "2025-07-09" +"%Y-%m-%d")
if [[ "${date_frmt}" -ge "${cmpr_date}" && "${date_frmt}" -lt "${high_date}" ]]
then
    fname=$(echo "$lstr" | awk '{print $3}')
    gsutil cp "${fname}" gs://output-dev/ 
    if [ $? -eq 0 ]
    then
       echo "1 File Successfully Copied to Target Location"
    else
       echo "Error in copying file - ${fname}"
    fi
else 
    echo "Skipping File ${fname} as it falls outside date range"
fi

gsutil ls -l命令输出:

$ gsutil ls -l gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml

13461 2024-10-11T07:45:15Z gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml
TOTAL: 1 objects, 13461 bytes (13.35 KiB)
问题排查与修复

核心问题1:错误使用数值比较运算符

[[ ]]中-ge/-lt是数值比较运算符,但YYYY-MM-DD格式的日期是字符串。虽然该格式按字典序可正确比较,但用数值运算符会将日期字符串当作数字解析,导致比较逻辑完全错误。

核心问题2:fname变量未提前定义

fname仅在if分支内赋值,进入else分支时变量未定义,输出提示会出现空值,同时也会干扰对问题原因的判断。

额外问题:gsutil ls -l输出包含总行

原脚本直接读取命令的全部输出,合并后可能导致字段提取异常(多文件场景下问题更明显),需过滤掉TOTAL开头的汇总行。

修复后的脚本

# 过滤TOTAL汇总行,仅保留文件信息行
lstr=$(gsutil ls -l gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml | grep -v "^TOTAL")
# 一行awk完成日期提取,减少管道操作
prcs_date=$(echo "${lstr}" | awk -F"[T ]" '{print $2}')
# YYYY-MM-DD格式可直接字符串比较,无需date转换
date_frmt="${prcs_date}"
cmpr_date="2024-05-01"
high_date="2025-07-09"
# 提前定义fname变量,避免else分支空值
fname=$(echo "${lstr}" | awk '{print $3}')

# 使用字符串比较运算符
if [[ "${date_frmt}" >= "${cmpr_date}" && "${date_frmt}" < "${high_date}" ]]
then
    gsutil cp "${fname}" gs://output-dev/ 
    if [ $? -eq 0 ]
    then
       echo "1 File Successfully Copied to Target Location"
    else
       echo "Error in copying file - ${fname}"
    fi
else 
    echo "Skipping File ${fname} as it falls outside date range"
fi

关键优化说明

  1. 用grep -v "^TOTAL"过滤汇总行,确保仅处理有效文件信息。
  2. 合并awk命令,通过-F"[T ]"同时按空格和T分割,直接提取日期部分,简化流程。
  3. 利用YYYY-MM-DD格式的字典序特性,直接字符串比较,省去date转换步骤。
  4. 提前定义fname变量,避免分支内未赋值导致的空值问题。
  5. 将数值比较运算符替换为字符串比较运算符>=/<,确保日期判断逻辑正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:45:55