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

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

親ディレクトリ内のスクリプトを呼び出して、サブジェクト データのバッチを再帰的に処理しています。

たとえば、親ディレクトリは次のようになります。

/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

関連情報