다음과 같이 파일 이름에 숫자 레이블이 있는 수백 개의 파일 이름이 있습니다.
AAAA #12 SSSS.TXT
BBB #231 CDF.TXT
CDFSDAAAA #1 AAAASS.TXT
다음과 같이 이름을 바꾸고 싶습니다.
#012 - AAAA #12 SSSS.TXT
#231 - BBB #231 CDF.TXT
#001 - CDFSDAAAA #1 AAAASS.TXT
어떻게 해야 하나요?
감사해요
답변1
bash 쉘에서는
for file in *.TXT
do
[[ $file =~ \#([[:digit:]]+) ]] && mv -- "$file" "#$(printf '%03d' "${BASH_REMATCH[1]}") - ${file}"
done
이는 현재 디렉토리에서 다음으로 끝나는 모든 파일을 반복하여 .TXT
bash의 조건식 연산자와 =~
비교합니다 . 전달된 파일 이름을 오른쪽의 정규 표현식과 비교합니다. 정규식은 해시 태그(주석이 아닌 이스케이프 처리됨)와 일부(괄호 안에 캡처된) 숫자를 찾습니다. 탐욕 스럽기 +
때문에 첫 번째 숫자가 아닌 숫자(대소문자는 공백)로 끝나는 가능한 많은 숫자(1자리, 4자리 등)가 필요합니다.
Bash는 캡처된 숫자를 저장합니다 ${BASH_REMATCH[1]}
(첫 번째 대괄호 세트이기 때문에). 우리는 해당 숫자를 printf
3자리까지 0으로 채운 다음 -
나머지 이름 바꾸기를 수행하기 위해 추가합니다.
&&
이름 바꾸기는 일치가 성공한 경우에만 발생합니다(링크를 통해 ).
답변2
rename
Perl 기반 명령이 있는 경우
$ rename -n 's/.*#(\d+).*/sprintf "#%03d - %s", $1, $&/e' *.TXT
rename(AAAA #12 SSSS.TXT, #012 - AAAA #12 SSSS.TXT)
rename(BBB #231 CDF.TXT, #231 - BBB #231 CDF.TXT)
rename(CDFSDAAAA #1 AAAASS.TXT, #001 - CDFSDAAAA #1 AAAASS.TXT)
( -n
테스트 목적으로 추가됨)