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
수 있어야 합니다 . 불행히도 저는 이 작업을 수행하지 않습니다. 숫자를 추출하는 단계 셸 확장이 없다고 생각합니다. 내가 얻을 수 있는 가장 가까운 것은 다음과 같습니다.printf
bash
coreutils
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에 저장됩니다.마지막으로
e
Perl에게 명령을 평가하라고 지시합니다sprintf "%04d.", $1
. 이 명령은%04d
0과 마침표가 붙은 4자리 숫자 형식으로 그룹 1의 숫자를 반환합니다 .