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

Bash脚本Globbing文件名后生成.gz文件时通配符失效问题求助

解决通配符匹配后生成正确压缩文件名的问题

问题背景

目录中有一批格式规范的文件(如1.SNV.111-T.vcf),需要借助包含文件名片段(如111-T)的文本文件,通过通配符匹配完整文件名,最终用bgzip生成带.gz后缀的压缩文件。

原编写的Bash脚本如下:

#!/bin/bash
while getopts f: flag
do
        case "${flag}" in
                f) file=${OPTARG};;
esac
done

while IFS="" read -r p || [ -n "$p" ]
do
        vcf="*${p}.vcf"

        bgzip -c ${vcf} > ${vcf}.gz

done < $file

脚本能成功执行bgzip,但输出文件名会变成*111-T.vcf.gz——因为输出路径中的通配符不会自动展开(目标文件不存在时,Shell不会解析通配符),导致带*的字符串被直接作为文件名。

修正后的脚本

#!/bin/bash
while getopts f: flag
do
    case "${flag}" in
        f) file="${OPTARG}";;
    esac
done

while IFS="" read -r p || [ -n "$p" ]
do
    # 遍历所有匹配通配符的文件,让Shell自动展开通配符
    for vcf in *"${p}".vcf; do
        # 确认当前路径是真实文件,避免无匹配时处理通配符字符串本身
        if [ -f "$vcf" ]; then
            bgzip -c "$vcf" > "${vcf}.gz"
        fi
    done
done < "$file"

关键说明

  • 用for循环遍历通配符表达式*"${p}".vcf,Shell会自动将其展开为所有匹配的实际文件名
  • 添加[ -f "$vcf" ]判断,防止当没有任何文件匹配时,误将*${p}.vcf这个字符串当作文件名处理
  • 所有变量用双引号包裹,避免文件名包含空格、特殊字符时出现解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:41:17