如何在 shell 脚本中的目录之间迭代
How to iterate between directories in shell script
我想使用函数 fslchfiletype
.
将图像从 .img
转换为 .nii.gz
这些图片分别存放在Controls
和Patients
文件夹中,每个文件夹下都有几个属于每个人的文件夹,如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_maks
的 folder
。
这给了我下一个错误:
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
中添加了 *
。
我想使用函数 fslchfiletype
.
.img
转换为 .nii.gz
这些图片分别存放在Controls
和Patients
文件夹中,每个文件夹下都有几个属于每个人的文件夹,如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_maks
的 folder
。
这给了我下一个错误:
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
中添加了 *
。