상위 디렉터리가 아닌 각 하위 디렉터리로 직접 재귀 쉘 스크립트 출력

상위 디렉터리가 아닌 각 하위 디렉터리로 직접 재귀 쉘 스크립트 출력

나는 상위 디렉터리 내에서 스크립트를 호출하여 일련의 주제 데이터를 반복적으로 처리하고 있습니다.

예를 들어, 상위 디렉터리가 있습니다.

/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

관련 정보