如何修改Shell脚本实现动态文件名的存在性检查?
解决Shell脚本通配符检查文件存在的问题
你之前的写法失败有两个核心原因:
- 引号包裹了通配符
*,导致Shell把它当作普通字面字符处理,不会自动展开成匹配的文件名 - 即便去掉引号,
[ -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
相关产品推荐
相关产品推荐

