A1.txt를 A0001.txt로 변경하는 등 일괄 파일 이름에서 일련 번호의 형식을 다시 지정하는 방법은 무엇입니까? [복사]

A1.txt를 A0001.txt로 변경하는 등 일괄 파일 이름에서 일련 번호의 형식을 다시 지정하는 방법은 무엇입니까? [복사]

A1.txt A2.txt...A11.txt A12.txt 등의 파일이 있습니다. A0001.txt A0002.txt...A0011.txt 등으로 이름을 바꾸고 싶습니다. 내가 제대로 하고 있는 걸까?

for file in A*.txt
do
mv ${file} ${file/-#.txt-/-"%5d".txt}
done

답변1

@John1024가 제안한 옵션이 없는 경우 (내장되어 있지만 GUN에서도 사용 가능 )을 사용하여 원하는 필드 너비와 패딩으로 십진수 형식을 지정할 prename수 있어야 합니다 . 불행히도 저는 이 작업을 수행하지 않습니다. 숫자를 추출하는 단계 셸 확장이 없다고 생각합니다. 내가 얻을 수 있는 가장 가까운 것은 다음과 같습니다.printfbashcoreutils

for file in A*.txt
do
  base="${file%.*}"
  printf -v newfile "A%04d.txt" "${base#A}"
  mv -- "$file" "$newfile"
done

답변2

Perl의 이름 바꾸기 유틸리티를 사용하십시오.

prename 's/(\d+)\./sprintf "%04d.", $1/e' A*.txt

prename때로는 이름으로 사용될 수도 있습니다 rename. 그러나 rename일부 배포판에는 이 유틸리티라는 또 다른 관련이 없고 호환되지 않는 유틸리티가 기본적으로 설치되어 있습니다.

Debian과 같은 배포판에는 기본적으로 Perl의 이름 변경/미리 이름이 설치되어 있습니다. 배포판에 없으면 설치 지침을 찾을 수 있습니다.여기

(이 명령의 향상된 버전에 대해 Steeldriver에게 찬사를 보냅니다.)

다음 파일이 포함된 디렉터리를 고려해보세요.

$ ls
A12345.txt  A123.txt  A12.txt  A1.txt

이제 prename을 실행해 보겠습니다.

$ prename 's/(\d+)\./sprintf "%04d.", $1/e' A*.txt
$ ls
A0001.txt  A0012.txt  A0123.txt  A12345.txt

어떻게 작동하나요?

단일 대체 명령을 사용하십시오.

s/(\d+)\./sprintf "%04d.", $1/e
  • (\d+)\.마침표가 뒤에 오는 하나 이상의 숫자와 일치합니다. 이 번호는 그룹 1에 저장됩니다.

  • 마지막으로 ePerl에게 명령을 평가하라고 지시합니다 sprintf "%04d.", $1. 이 명령은 %04d0과 마침표가 붙은 4자리 숫자 형식으로 그룹 1의 숫자를 반환합니다 .

관련 정보