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

1

Estou processando um lote de dados de assuntos recursivamente, chamando o script dentro do 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 tem a extensão de arquivo ".nii". Eu compus um código, que chama um número de comandos de um programa de neurociência, procurando por aquela extensão de arquivo particular como a 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, esse código é inadequado, pois 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, por favor, ser capaz de me dar dicas de como eu posso modificar o código para salvar a saída de acordo com o arquivo ".nii" de entrada?

    
por ap123 24.04.2013 / 10:02

2 respostas

3

Você deseja usar dirname $file para obter o nome do diretório do seu arquivo de entrada e acrescentar 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 dos rawdata são argumentos de comando reais ou se todos são nomes de arquivos. O mesmo com rawnodif_brain_mask , que você pode precisar adaptar da mesma maneira.

    
por 24.04.2013 / 10:10
3

Obrigado, aqui está o roteiro final. Observe que o $ denota um nome de arquivo, enquanto o resto 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
    
por 25.04.2013 / 03:13