
파일을 쌍으로 처리해야 합니다. 그래서 내가 가진 경우 :
00000.nii.gz
00001.nii.gz
00002.nii.gz
00003.nii.gz
등등... ( nii.gz
영상공명처리시 사용되는 확장자입니다.) 파일 00000.nii.gz
과 00001.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자리 문자열로 형식화합니다.printf
i
i+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