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

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

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

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

/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

관련 정보