如何用Shell脚本结合FreeSurfer批量将MGZ文件转换为NII文件?
MGZ转NII自动化脚本错误修复
错误原因分析
- 通配符未正确展开:原脚本中
for FILE in "${fp}/*"的双引号会阻止shell解析*通配符,导致循环仅处理${fp}/*这个字符串(而非文件夹内的实际文件),后续路径处理全部失效。 - 路径重复拼接:
filepath=$fp$FILE中$FILE已经包含$fp前缀,重复拼接会生成/path/path/*这类无效路径,使得basename无法正确提取文件名,最终输出参数异常,触发mri_convert: missing output volume name错误。 - 未过滤目标文件:脚本会遍历文件夹内所有文件,包括非MGZ格式文件,无意义且可能引发额外错误。
修正后的脚本
#!/bin/bash # 询问目标文件夹路径 read -p "Enter filepath: " fp # 确认路径 read -p "Continue? You said ${fp} (Y/N): " confirm if [[ ! $confirm =~ ^[yY]([eE][sS])?$ ]]; then exit 1 fi # 遍历文件夹内所有文件(正确展开通配符) for FILE in "$fp"/* do # 跳过目录(只处理文件) if [[ -d "$FILE" ]]; then continue fi # 提取文件名与扩展名 filename_with_ext=$(basename "$FILE") filename="${filename_with_ext%.*}" extension="${filename_with_ext##*.}" # 仅处理MGZ格式文件 if [[ "$extension" != "mgz" ]]; then continue fi # 生成输出文件路径(与原文件同目录) ni_file="${fp}/${filename}.nii" # 执行格式转换 mri_convert "$FILE" "$ni_file" echo "Converted: $FILE -> $ni_file" done
关键修正点说明
- 移除通配符的双引号:
"$fp"/*让shell正确遍历目标文件夹内的所有文件。 - 跳过目录:增加
if [[ -d "$FILE" ]]; then continue; fi避免处理子目录。 - 过滤MGZ文件:仅对
.mgz后缀的文件执行转换,提升效率。 - 输出文件路径修正:将生成的NII文件保存在原文件夹内(原脚本会输出到当前工作目录)。
- 增加转换提示:
echo语句方便跟踪转换进度。
内容的提问来源于stack exchange,提问作者Leah
相关产品推荐
相关产品推荐

