파일을 쌍으로 처리하는 방법

파일을 쌍으로 처리하는 방법

파일을 쌍으로 처리해야 합니다. 그래서 내가 가진 경우 :

00000.nii.gz   
00001.nii.gz
00002.nii.gz
00003.nii.gz 

등등... ( nii.gz영상공명처리시 사용되는 확장자입니다.) 파일 00000.nii.gz00001.nii.gz함께 처리해야 한다는 0002.nii.gz등등 00003.nii.gz. 각 출력에 대해 이름을 바꿔야 합니다.

답변1

파일 이름의 숫자는 0으로 채워진 5자리 숫자이고 질문과 댓글의 가끔 4자리 문자열은 철자 오류라고 가정합니다.

#!/bin/bash

for (( i = 0; i <= 99999; i += 2 )); do
    name1=$( printf '%05d.nii.gz' "$i" )
    name2=$( printf '%05d.nii.gz' "$(( i + 1 ))" )

    if [ -f "$name1" ] && [ -f "$name2" ]; then
        printf 'Processing "%s" and "%s" together...\n' "$name1" "$name2" >&2
        # use the two files here
    else
        printf '"%s" or "%s" not found, exiting.\n' "$name1" "$name2" >&2
        break
    fi
done

0부터 큰 숫자까지 2씩 반복합니다. 각 반복마다 두 번의 호출 (하나는 for 및 다른 하나 ) i의 변수를 사용하여 두 개의 파일 이름을 구성합니다 . 형식 지정자는 정수를 0으로 채워진 5자리 문자열로 형식화합니다.printfii+1%05d

구성된 파일 이름이 더 이상 기존 파일(현재 디렉터리의)과 일치하지 않으면 루프가 종료됩니다.

파일이 현재 디렉토리가 아닌 다른 디렉토리에 있는 경우 printf형식 문자열 '%05d.nii.gz''/path/to/dir/%05d.nii.gz'.


DRY 원칙("반복하지 마십시오")을 준수하려면 다음을 수행하십시오.

#!/bin/bash

dir='/path/to/dir'
name_fmt="$dir/%05d.nii.gz"

for (( i = 0; i <= 99999; i += 2 )); do
    name1=$( printf "$name_fmt" "$i" )
    name2=$( printf "$name_fmt" "$(( i + 1 ))" )

    if [ -f "$name1" ] && [ -f "$name2" ]; then
        printf 'Processing "%s" and "%s" together...\n' "$name1" "$name2" >&2
        # use the two files here
    else
        printf '"%s" or "%s" not found, exiting.\n' "$name1" "$name2" >&2
        break
    fi
done

답변2

다음과 같은 파일이 많이 있다고 가정해 보겠습니다.

echo z?
z1 z2 z3 z4 z5 z6 z7 z8 z9

그런 다음 커플을 얻으려면 다음을 사용할 수 있습니다.

echo z? | xargs -n2
z1 z2
z3 z4
z5 z6
z7 z8
z9

트리플을 얻으세요:

echo z? | xargs -n3
z1 z2 z3
z4 z5 z6
z7 z8 z9

xargs의 기본 명령은 echo이지만 직접 제공할 수도 있습니다. xargs 매뉴얼 페이지는 꽤 길지만 끝에 몇 가지 예가 포함되어 있습니다.

행운을 빕니다... 건배, drl

관련 정보