
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 $file
para 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 rawdata
argumentos de comando reais ou se todos são nomes de arquivos. O mesmo com rawnodif_brain_mask
o 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