Saída direta de script de shell recursivo para cada subdiretório, não para o diretório pai

Saída direta de script de shell recursivo para cada subdiretório, não para o diretório pai

Estou processando um lote de dados de assuntos recursivamente, chamando o script no diretório pai.

Por exemplo, eu tenho o diretório pai:

/home/subjects

e os subdiretórios que contêm os dados:

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

Cada arquivo em cada subdiretório possui a extensão ".nii". Eu compus um código que chama vários comandos de um programa de neurociência, procurando aquela extensão de arquivo específica como entrada. A entrada para o primeiro comando "fslroi" é o arquivo .nii ($file), enquanto o arquivo de saída desse comando é "rawdata.nii". Como você pode ver a saída de um comando, é a entrada para o próximo, 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

No entanto, este código é inadequado porque não consigo salvar a saída no subdiretório específico. Assim, como estou processando vários assuntos o código não funcionará pois tudo está sendo salvo no diretório pai.

Alguém poderia me dar alguma dica de como posso modificar o código para salvar a saída de acordo com o arquivo ".nii" de entrada?

Responder1

Você deseja usar dirname $filepara obter o nome do diretório do seu arquivo de entrada e anexá-lo ao nome do arquivo de saída.

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

Não está claro quais são rawdataargumentos de comando reais ou se todos são nomes de arquivos. O mesmo com rawnodif_brain_masko qual você pode precisar se adaptar da mesma maneira.

Responder2

Obrigado, aqui está o roteiro final. Observe que $ denota um nome de arquivo, enquanto o restante são comandos ou 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

informação relacionada