HPC의 여러 하위 디렉터리를 통해 순차적으로 루프 실행

HPC의 여러 하위 디렉터리를 통해 순차적으로 루프 실행

나는 이것이 중복된 질문이라는 것을 알고 있지만 내가 본 제안 중 어느 것도 내가 원하는 것을 수행하지 않습니다.

처리량이 높은 데이터에 대해 다양한 작업을 수행하기 위해 다양한 모듈이 있는 HPC 클러스터를 사용하고 있습니다. 이전에는 다음 코드를 사용하여 디렉터리에 있는 일련의 파일에 대해 작업을 수행했습니다.

#!/bin/bash

module load random_module

fqFiles=`find $1 -name '*.nii' -type f`

for fqFile in $fqFiles;do
some random action
done

그러나 더 많은 파일과 관련된 좀 더 복잡한 작업을 수행하고 여러 하위 폴더에서 수행하고 싶습니다.

각 하위 폴더는 서로 다른 ID를 가진 서로 다른 표본에 속하며 표본 ID(표본 이름에 따라 변경됨)를 반영하는 여러 파일을 포함합니다.

각 하위 폴더 내에서 수행해야 할 작업은 다음과 같습니다.

eddy --main=ID.nii \
--mask=ID_mask.nii \
--index=ID_index.txt \
--acqp=ID_acqp.txt \
--bvecs=ID.bvec \
--bvals=ID.bval \
--fwhm=0 \
--flm=quadratic \
--out=eddy_out \
--data_is_shelled

여기서 "ID"는 분석할 샘플의 ID에 따라 변경됩니다. 하위 폴더 "specimen1"은 다음과 같이 이름이 지정되며 분석할 50개 샘플 모두에 대해 동일한 파일 specimen1.nii, specimen1_mask.nii, 등을 포함합니다. specimen1_index.txt문제는 모든 샘플의 이름이 "Mike", "Charles", "Anita" 등과 같이 서로 다르기 때문에 연속적이거나 숫자가 아니라는 것입니다.

하위 폴더 이름과 파일 접두사가 다르지만 한 폴더에서 작업을 수행한 후 다음 폴더로 이동하여 다음 하위 폴더에서 동일한 작업을 수행하는 스크립트로 이를 래핑하는 데 도움을 줄 수 있는 사람이 있습니까?

매우 감사합니다!

답변1

귀하의 추가 정보를 토대로 볼 때 다음이 해결책이라고 확신합니다.

for SPEC in * 
do 
    cd "$SPEC" 
    eddy --main="${SPEC}.nii" \
         --mask="${SPEC}_mask.nii" \
         --index="${SPEC}_index.txt" \
         --acqp="${SPEC}_acqp.txt" \
         --bvecs="${SPEC}.bvec" \
         --bvals="${SPEC}.bval" \
         --fwhm=0 --flm=quadratic --out=eddy_out --data_is_shelled
    cd ..
done

논의하다

귀하의 ID를 "sample"인 SPEC로 대체했습니다(원하는 대로 부르셔도 됩니다). 모든 샘플 하위 디렉터리 목록을 생성 하고 이를 *차례로 for변수에 할당하는 루프를 반복합니다.SPEC

디렉터리 이름에는 셸에서 해석할 수 있는 흥미로운 문자가 포함될 수 있으므로 쌍에 대한 모든 참조는 SPEC큰따옴표로 묶입니다. 이는 USD 이외의 특수 문자의 해석을 제거합니다.

따라서 각 에 대해 SPEC하위 디렉터리로 이동하여 명령을 실행 eddy하고 상위 디렉터리로 돌아갑니다. 등의 밑줄이 변수 이름의 일부로 해석되기 {SPEC}때문에 이런 방식으로 작성됩니다 . SPEC_mask변수 이름에는 점이 포함될 수 없기 때문에 "$SPEC.nii"이 방법은 작동하지만 { }일관성을 위해 점을 유지했습니다.

관련 정보