我知道这是一个重复的问题,但我看到的建议都不符合我想要的。
我正在使用一个 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.nii
、specimen1_mask.nii
、specimen1_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"
因此可以工作,但{ }
为了保持一致性,我保留了点。