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
相关产品推荐
相关产品推荐

