如何在 shell 脚本中的目录之间迭代

How to iterate between directories in shell script

我想使用函数 fslchfiletype.

将图像从 .img 转换为 .nii.gz

这些图片分别存放在ControlsPatients文件夹中,每个文件夹下都有几个属于每个人的文件夹,如C01, C02,等。具体来说,每个人都有 .img 个文件,位于一个名为 rs_roi 的文件夹中,该文件夹位于另一个名为 ROIS2 的文件夹中。这是我的:

DIR="/media/Roy"; cd "$DIR/Analysis"
for group in Controls Patients; do
    for case in $group; do
        mkdir $DIR/Analysis/$group/$case/Cortical_masks 
                
        for file in $DIR/Analysis/$group/$case/ROIS2/rs_roi/.img; do
        fslchfiletype NIFTI_GZ "$file"
        done;
    done;
done;       

注意我还想在每个个体中创建一个名为 Cortiical_maksfolder

这给了我下一个错误:

mkdir: cannot create directory ´media/Roy/Analysis/Controls/Controls/Cortical_masks´: No such file or directory.
Cannot open volume media/Roy/Analysis/Controls/Controls/ROIS2/rs_roi/ for reading!
mkdir: cannot create directory ´media/Roy/Analysis/Patients/Patients/Cortical_masks´: No such file or directory.
Cannot open volume media/Roy/Analysis/Patients/Patients/ROIS2/rs_roi/ for reading!

它正在 Controls Patients 文件夹迭代两次:Control/Control。也许问题出在这里for case in $group; do?感谢

一旦将目录名称分配给变量,就必须对目录进行 glob 操作以获取其内容。否则,如您所见,$group 不会展开,您只是在遍历该单个术语本身。

您可能还想在遍历每个条目之前检查它是否确实是一个目录。

for case in $group/*; do
    [ -d $case ] || continue
    mkdir $DIR/Analysis/$group/$case/Cortical_masks 
            
    for file in $DIR/Analysis/$group/$case/ROIS2/rs_roi/.img; do
    fslchfiletype NIFTI_GZ "$file"
    done;
done;

您可能还应该在更多地方引用您的变量,除非您确定它们不需要引用。我总是用 shellcheck 来检查我的脚本以获得这样的建议。

我对@Noah 的回答做了一个小改动,这个脚本运行良好:

for group in Controls Patients; do
    for case in $group/*; do
        [ -d $case ] || continue
        mkdir $DIR/Analysis/$case/Cortical_masks 
            
        for file in $DIR/Analysis/$case/ROIS2/rs_roi/*.img; do
        fslchfiletype NIFTI_GZ "$file"
        done;
    done;
done;   

我删除了两个路径中的 $group,并在我忘记的 *.img 中添加了 *