Прямой рекурсивный вывод скрипта оболочки в каждый подкаталог, а не в родительский каталог

Прямой рекурсивный вывод скрипта оболочки в каждый подкаталог, а не в родительский каталог

Я обрабатываю пакет данных субъектов рекурсивно, вызывая скрипт в родительском каталоге.

Например, у меня есть родительский каталог:

/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

Связанный контент