FreeSurfer批处理

一个串行(顺序执行)的安全版脚本,功能:

  • ✅ 自动遍历 T1/编号/*.nii.gz
  • ✅ 自动设置 subject_id
  • ✅ 跳过已处理过的 subject(避免重复)
  • ✅ 每个 subject 单独日志
  • ✅ 报错记录到 failed_subjects.txt

✅ 安全稳定的串行脚本(推荐)

保存为 recon_all_serial.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

# 设置 FreeSurfer 输出路径
export SUBJECTS_DIR=$PWD/freesurfer_output
mkdir -p "$SUBJECTS_DIR"
mkdir -p logs # 存放日志文件

# 清空旧的错误记录
> logs/failed_subjects.txt

# 遍历所有 NIfTI 文件
for nii_file in T1/*/*.nii.gz; do
subject_id=$(basename $(dirname "$nii_file"))
log_file="logs/${subject_id}.log"

# 如果已经处理过则跳过
if [ -e "$SUBJECTS_DIR/$subject_id/mri/brain.mgz" ]; then
echo "$subject_id 已完成,跳过" | tee -a "$log_file"
continue
fi

echo "开始处理 $subject_id..." | tee "$log_file"

# 执行 recon-all,日志写入文件
recon-all -i "$nii_file" -s "$subject_id" -all >> "$log_file" 2>&1

# 检查是否处理成功(brain.mgz 是否存在)
if [ -e "$SUBJECTS_DIR/$subject_id/mri/brain.mgz" ]; then
echo "✅ $subject_id 完成" | tee -a "$log_file"
else
echo "❌ $subject_id 失败" | tee -a "$log_file"
echo "$subject_id" >> logs/failed_subjects.txt
fi
done

echo "✅ 所有任务已完成,请检查 logs/failed_subjects.txt 是否有失败样本。"

📂 目录结构建议:

1
2
3
4
5
6
7
8
9
10
11
12
your_project/
├── T1/
│ ├── 40000/
│ │ └── xxx.nii.gz
│ ├── 40001/
│ │ └── yyy.nii.gz
├── recon_all_serial.sh
├── logs/
│ ├── 40000.log
│ ├── 40001.log
│ └── failed_subjects.txt
├── freesurfer_output/ (自动创建)

✅ 使用方法:

1
2
sodu chmod +x recon_all_serial.sh
./recon_all_serial.sh


FreeSurfer批处理
https://xingdayup.github.io/2025/07/30/recon-all-serial/
Author
Jesse Chen
Posted on
July 30, 2025
Licensed under