直接递归shell脚本输出到每个子目录,而不是父目录

直接递归shell脚本输出到每个子目录,而不是父目录

我正在递归地处理一批受试者数据,调用父目录中的脚本。

例如,我有父目录:

/home/subjects

以及包含数据的子目录:

/home/subjects/0393
/home/subjects/0389
/home/subjects/9920 (Around 250 subjects)

每个子目录中的每个文件都有文件扩展名“.nii”。我编写了一个代码,它从神经科学程序中调用许多命令,搜索特定的文件扩展名作为输入。第一个命令“fslroi”的输入是.nii 文件($file),而该命令的输出文件是“rawdata.nii”。正如您所看到的,一个命令的输出是下一个命令的输入等

for file in $(find ./ -name "*.nii")
do
fslroi $file rawdata.nii 0 33
gunzip rawdata.nii.gz -f
fslroi rawdata.nii rawnodif 0 1
bet rawnodif rawnodif_brain -m -g 0.2 -f 0.3
fslmaths rawnodif -mas rawnodif_brain_mask rawnodif_brain
gunzip rawnodif_brain_mask.nii.gz -f
done

但是,此代码是不够的,因为我无法将输出保存到特定的子目录中。因此,当我正在处理几个主题时,代码将无法工作,因为所有内容都被保存到父目录中。

有人可以给我任何提示,告诉我如何修改代码以根据输入“.nii”文件保存输出吗?

答案1

您想要用来dirname $file获取输入文件的目录名并将其添加到输出文件名之前。

for file in $(find ./ -name "*.nii")
do
rawdata = $(dirname $file)/rawdata.nii
fslroi $file $rawdata 0 33
gunzip $rawdata.gz -f
fslroi $rawdata rawnodif 0 1
bet rawnodif rawnodif_brain -m -g 0.2 -f 0.3
fslmaths rawnodif -mas rawnodif_brain_mask rawnodif_brain
gunzip rawnodif_brain_mask.nii.gz -f
done

目前尚不清楚哪些是rawdata实际的命令参数,或者是否全部都是文件名。rawnodif_brain_mask您可能需要以同样的方式适应。

答案2

谢谢,这是最终的脚本。请注意,$ 表示文件名,而其余部分是命令或参数。

#!/bin/bash

for file in $(find ./ -name "*.nii")
do
rawdata=$(dirname $file)/rawdata.nii.gz
rawnodif=$(dirname $file)/rawnodif.nii.gz
rawnodif_brain=$(dirname $file)/rawnodif_brain.nii.gz
rawnodif_brain_mask=$(dirname $file)/rawnodif_brain.nii.gz
fslroi $file $rawdata 0 33
fslroi $rawdata $rawnodif 0 1
gunzip $rawdata -f
bet $rawnodif $rawnodif_brain -m -g 0.2 -f 0.3
fslmaths $rawnodif -mas $rawnodif_brain_mask $rawnodif_brain
gunzip $rawnodif_brain_mask -f
done

相关内容