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

Gitlab CI脚本中文件匹配MANIFEST模式异常:seqrun_A.json未匹配

问题:seqrun_A.json无法匹配MANIFEST中的seqrun_*.json模式

背景信息

示例文件列表

A_cycles.pdf
A_filter_passed_vs_occupied.pdf
A_grouped_cycle.csv
A_grouped_lane.csv
A_grouped_lane_cycle.csv
A_metadata.csv
A_percent_q30.pdf
A_raw.csv
seqrun_A.json

MANIFEST内容

*_grouped_cycle.csv
*_grouped_lane.csv
*_grouped_lane_cycle.csv
*_metadata.csv
*_raw.csv
seqrun_*.json

执行的Shell脚本

while IFS= read -r pattern; do
    # Modify the pattern to match filenames without needing to escape dot characters
    modified_pattern="${pattern//./[.]}"
    # Convert the modified pattern to a regular expression
    regex_pattern="^${modified_pattern//\*/.*}"
    # Check if the filename matches the pattern using regular expressions
    if [[ "$filename1" =~ $regex_pattern ]]; then
        included=true
        echo "Filename $(basename "$filename1") matched pattern $pattern in MANIFEST"
        break
    fi
done < <(grep -v '^#' "$MANIFEST_FILE")

脚本执行输出

Filename A_grouped_cycle.csv matched pattern *_grouped_cycle.csv in MANIFEST
Filename A_grouped_lane.csv matched pattern *_grouped_lane.csv in MANIFEST
Filename A_grouped_lane_cycle.csv matched pattern *_grouped_lane_cycle.csv in MANIFEST
Filename A_metadata.csv matched pattern *_metadata.csv in MANIFEST
Filename A_raw.csv matched pattern *_raw.csv in MANIFEST

问题原因

脚本中用于匹配的$filename1是完整文件路径(例如./seqrun_A.json或/builds/project/seqrun_A.json),而seqrun_*.json转换后的正则表达式为^seqrun_.*[.]json——该正则要求字符串必须以seqrun开头。但带路径的文件名开头是路径前缀(如./),因此无法匹配。

而其他以*开头的模式(如*_grouped_cycle.csv)转换后的正则是^.*_grouped_cycle[.]csv,其中.*会匹配路径前缀部分,因此能正常匹配带路径的文件名。

解决方法

方案1:提取文件名的basename后再匹配(推荐)

MANIFEST中的模式针对的是文件名而非完整路径,先提取文件名的basename再进行匹配更准确。修改脚本如下:

# 先提取文件名的basename
file_basename=$(basename "$filename1")

while IFS= read -r pattern; do
    modified_pattern="${pattern//./[.]}"
    regex_pattern="^${modified_pattern//\*/.*}$"
    if [[ "$file_basename" =~ $regex_pattern ]]; then
        included=true
        echo "Filename $file_basename matched pattern $pattern in MANIFEST"
        break
    fi
done < <(grep -v '^#' "$MANIFEST_FILE")

方案2:修改正则表达式适配路径前缀

如果需要保留完整路径匹配,可以调整正则表达式,允许路径前缀存在:

while IFS= read -r pattern; do
    modified_pattern="${pattern//./[.]}"
    # 将开头的^替换为.*,允许路径前缀存在,同时保留结尾$确保匹配完整文件名
    regex_pattern=".*${modified_pattern//\*/.*}$"
    if [[ "$filename1" =~ $regex_pattern ]]; then
        included=true
        echo "Filename $(basename "$filename1") matched pattern $pattern in MANIFEST"
        break
    fi
done < <(grep -v '^#' "$MANIFEST_FILE")

内容的提问来源于stack exchange,提问作者P. Solar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:27:01