
親ディレクトリ内のスクリプトを呼び出して、サブジェクト データのバッチを再帰的に処理しています。
たとえば、親ディレクトリは次のようになります。
/home/subjects
データを含むサブディレクトリ:
/home/subjects/0393
/home/subjects/0389
/home/subjects/9920 (Around 250 subjects)
各サブディレクトリ内の各ファイルのファイル拡張子は「.nii」です。私は、神経科学プログラムからいくつかのコマンドを呼び出して、その特定のファイル拡張子を入力として検索するコードを作成しました。最初のコマンド「fslroi」への入力は .nii ファイル ($file) で、そのコマンドの出力ファイルは「rawdata.nii」です。ご覧のとおり、1 つのコマンドからの出力は、次のコマンドへの入力になります。
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