
我正在遞歸地處理一批受試者數據,並呼叫父目錄中的腳本。
例如,我有父目錄:
/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