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

排查从NAS/FTP目录选取指定模式最新文件的Shell脚本错误

脚本问题说明

原有脚本存在的核心问题

  • 通配符被错误转义:[ -f /NAS/"GE_REF_DATA*".txt ] 中双引号包裹了通配符*,Shell不会将其作为通配符匹配文件,只会逐字匹配文件名包含*的文件,同时你额外添加的.txt后缀和给出的文件名模式GE_REF_DATA*不符,直接导致路径存在性判断永远为假。
  • 判断逻辑不符合需求:你使用&&要求两个模式的文件必须同时存在才会触发当前路径的逻辑,但需求明确允许仅存在其中一种模式的文件,当前逻辑会漏掉单模式文件存在的场景。
  • 执行逻辑混乱:NAS路径匹配成功的分支中,你执行了cd /FTP的无效操作,且NAS分支没有输出var1、var2的代码,只有FTP分支才有输出,就算NAS路径找到了文件也看不到结果。
  • 缺少空匹配处理:如果路径下没有对应模式的文件,ls -t 模式会输出错误信息,还会把错误内容赋值给变量,需要提前规避。

修正后的可用脚本

#!/bin/bash
# 优先检查NAS路径
target_dir="/NAS"
# 拉取对应模式最新文件,空匹配时屏蔽错误输出
ref_files=$(ls -t ${target_dir}/GE_REF_DATA* 2>/dev/null | head -n 1)
cust_files=$(ls -t ${target_dir}/GE_CUST_DET_DATA* 2>/dev/null | head -n 1)

# 如果NAS下两种文件都不存在,再检查FTP
if [ -z "$ref_files" ] && [ -z "$cust_files" ]; then
    target_dir="/FTP"
    ref_files=$(ls -t ${target_dir}/GE_REF_DATA* 2>/dev/null | head -n 1)
    cust_files=$(ls -t ${target_dir}/GE_CUST_DET_DATA* 2>/dev/null | head -n 1)
fi

# 赋值变量,仅保留文件名去除前缀路径
var1=$(basename "$ref_files" 2>/dev/null)
var2=$(basename "$cust_files" 2>/dev/null)

# 输出结果
if [ -n "$var1" ] || [ -n "$var2" ]; then
    echo "Files present at ${target_dir}"
    [ -n "$var1" ] && echo "var1: $var1"
    [ -n "$var2" ] && echo "var2: $var2"
else
    echo "Files not present anywhere"
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:24:05