Salida del script de shell recursivo directo a cada subdirectorio, no al directorio principal

Salida del script de shell recursivo directo a cada subdirectorio, no al directorio principal

Estoy procesando un lote de datos de sujetos de forma recursiva, llamando al script dentro del directorio principal.

Por ejemplo, tengo el directorio principal:

/home/subjects

y los subdirectorios que contienen los datos:

/home/subjects/0393
/home/subjects/0389
/home/subjects/9920 (Around 250 subjects)

Cada archivo en cada subdirectorio tiene la extensión de archivo ".nii". He compuesto un código que llama a una serie de comandos de un programa de neurociencia, buscando esa extensión de archivo en particular como entrada. La entrada al primer comando "fslroi" es el archivo .nii ($file), mientras que el archivo de salida de ese comando es "rawdata.nii". Como puede ver, la salida de un comando es la entrada al siguiente, etc.

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

Sin embargo, este código es inadecuado ya que no puedo guardar el resultado en el subdirectorio particular. Por lo tanto, mientras estoy procesando varios temas, el código no funcionará ya que todo se guarda en el directorio principal.

¿Podría alguien darme alguna pista sobre cómo puedo modificar el código para guardar el resultado de acuerdo con el archivo de entrada ".nii"?

Respuesta1

Desea utilizar dirname $filepara obtener el nombre del directorio de su archivo de entrada y anteponerlo al nombre del archivo de salida.

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

No está claro cuáles rawdatason argumentos de comando reales o si todos son nombres de archivos. Mismos con rawnodif_brain_masklos que quizás necesites adaptarte de la misma forma.

Respuesta2

Gracias, aquí está el guión final. Tenga en cuenta que $ denota un nombre de archivo, mientras que el resto son comandos o argumentos.

#!/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

información relacionada