폴더에 있는 모든 파일의 이름을 다음으로 바꾸고 싶습니다.PREFIX+COUNTER+FILENAME
예를 들어. 입력하다:
england.txt
canada.txt
france.txt
산출:
CO_01_england.txt
CO_02_canada.txt
CO_03_france.txt
답변1
요청하신 내용은 다음과 같습니다.
n=1; for f in *.txt; do mv "$f" "CO_$((n++))_$f"; done
어떻게 작동하나요?
n=1
그러면 변수가
n
1로 초기화됩니다.for f in *.txt; do
그러면 이름이 로 시작하는 현재 디렉터리를 반복하는 루프가 시작됩니다
.txt
.mv "$f" "CO_$((n++))_$f"
이렇게 하면 파일 이름이 카운터로
CO_
접두사를 갖도록 변경됩니다.n
이++
기호는 bash에게 변수를 증가시키라고 지시합니다n
.done
이는 사이클의 끝을 나타냅니다.
개선하다
이 버전에서는 printf
이를 사용하여 숫자 형식을 더 효과적으로 제어할 수 있습니다.
n=1; for f in *.txt; do mv "$f" "$(printf "CO_%02i_%s" "$n" "$f")"; ((n++)); done
특히 이 형식은 숫자가 여전히 한 자리인 경우 %02i
숫자 앞에 0을 붙입니다 .n
답변2
prename
Debian 및 그 파생 제품 또는 Perl 패키지를 설치하여 다른 시스템에서 유틸리티를 사용하십시오 .Unicode::Tussle
:
prename 's ([^/]*\z) (sprintf("C0_%02d_%s", ++$n, $&))e' england.txt canada.txt france.txt
설명: 각 매개변수에 대해 기본 이름(슬래시가 없는 가장 긴 접미사)의 이름을 바꾼 다음 소수점 C0_
두 자리 숫자(사용 전 증가, 첫 번째 증가 및 사용 전 0부터 시작) 형식의 카운터 값, 그 뒤에 원래 이름. 사전순으로 번호가 매겨진 확장자를 가진 모든 파일의 이름을 바꾸려면:$n
_
.txt
prename 's ([^/]*\z) (sprintf("C0_%02d_%s", ++$n, $&))e' *.txt
zsh의 경우 다음을 사용하십시오.zmv
기능 및매개변수 확장 플래그 l
번호를 입력하세요:
autoload -U zmv
zmv '*.txt' '$f:h/C0_${(l:2::0:)$((++x))}_$f:t'