在 HPC 中的多个子目录中依次执行循环

在 HPC 中的多个子目录中依次执行循环

我知道这是一个重复的问题,但我看到的建议都不符合我想要的。

我正在使用一个 HPC 集群,该集群具有不同的模块来对高吞吐量数据执行不同的操作。以前,我已成功使用以下代码对目录中的一系列文件执行操作:

#!/bin/bash

module load random_module

fqFiles=`find $1 -name '*.nii' -type f`

for fqFile in $fqFiles;do
some random action
done

但是,我想执行一些涉及更多文件的更复杂的操作,并在多个子文件夹上执行它们。

每个子文件夹属于具有不同ID的不同标本,并包含许多反映标本ID的文件(根据标本名称而变化)。

需要在每个子文件夹内执行的操作是:

eddy --main=ID.nii \
--mask=ID_mask.nii \
--index=ID_index.txt \
--acqp=ID_acqp.txt \
--bvecs=ID.bvec \
--bvals=ID.bval \
--fwhm=0 \
--flm=quadratic \
--out=eddy_out \
--data_is_shelled

其中“ID”根据待分析样本的ID而变化。子文件夹“specimen1”的名称如下,包含文件specimen1.niispecimen1_mask.niispecimen1_index.txt等,这对于所有要分析的 50 个样本都是相同的。问题是所有样本都有不同的名字,比如“Mike”、“Charles”、“Anita”等,所以它不是连续的或数字的。

谁能帮我将其包装在一个脚本中,该脚本对一个文件夹执行操作,然后移动到下一个文件夹以对下一个子文件夹执行相同的操作,尽管子文件夹名称和文件前缀不同?

非常感谢!

答案1

根据您的补充信息,我相当有信心以下是一个解决方案:

for SPEC in * 
do 
    cd "$SPEC" 
    eddy --main="${SPEC}.nii" \
         --mask="${SPEC}_mask.nii" \
         --index="${SPEC}_index.txt" \
         --acqp="${SPEC}_acqp.txt" \
         --bvecs="${SPEC}.bvec" \
         --bvals="${SPEC}.bval" \
         --fwhm=0 --flm=quadratic --out=eddy_out --data_is_shelled
    cd ..
done

讨论

我用 SPEC 替换了您的 ID,即“样本”(您可以随意称呼它)。生成*所有样本子目录的列表,循环将它们一个接一个地for分配给变量。SPEC

由于目录名称中可能包含可由 shell 解释的有趣字符,因此所有对的引用都SPEC用双引号引起来。这消除了对除美元之外的特殊字符的解释。

因此,对于每个SPEC,我们进入子目录,运行命令eddy并返回到父目录。{SPEC}是这样写的,因为等中的下划线SPEC_mask否则会被解释为变量名的一部分。由于变量名称不能包含点,"$SPEC.nii"因此可以工作,但{ }为了保持一致性,我保留了点。

相关内容