親ディレクトリではなく各サブディレクトリに直接再帰シェルスクリプトを出力する

親ディレクトリではなく各サブディレクトリに直接再帰シェルスクリプトを出力する

親ディレクトリからスクリプトを呼び出して、トピックデータのバッチを繰り返し処理しています。

たとえば、親ディレクトリがあります。

/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

関連情報