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

如何修改Shell脚本实现动态文件名的存在性检查?

解决Shell脚本通配符检查文件存在的问题

你之前的写法失败有两个核心原因:

  1. 引号包裹了通配符*,导致Shell把它当作普通字面字符处理,不会自动展开成匹配的文件名
  2. 即便去掉引号,[ -f ... ]只能检查单个文件是否存在,若通配符匹配到多个文件,这个命令会因参数数量错误直接报错

下面给你几种可靠的修改方案:

方案一:利用数组和nullglob(推荐,兼容带空格的文件名)

# 开启nullglob选项:当通配符匹配不到文件时,返回空字符串而非保留原通配符
shopt -s nullglob
# 将匹配到的文件存入数组
target_files=(/Spool/Cognos/Cognos*.xlsx)
# 可选:关闭nullglob,恢复Shell默认行为
shopt -u nullglob

# 检查数组长度,大于0说明存在匹配的文件
if [ ${#target_files[@]} -gt 0 ]; then
    echo "File exists"
else
    echo "File not exists"
fi

方案二:使用compgen命令

compgen -G可以直接展开通配符,有匹配文件时输出文件名,无匹配时无输出,我们可以通过它的退出状态判断:

if compgen -G "/Spool/Cognos/Cognos*.xlsx" > /dev/null; then
    echo "File exists"
else
    echo "File not exists"
fi

方案三:用ls的退出状态(简单但有局限性)

if ls /Spool/Cognos/Cognos*.xlsx 1>/dev/null 2>&1; then
    echo "File exists"
else
    echo "File not exists"
fi

注意:如果目录下存在字面名为Cognos*.xlsx的文件(比如手动创建带*的文件),这个方法会误判;且文件名含换行符时也可能出问题,因此优先推荐前两种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:09:56