확장자를 유지하면서 0으로 채워진 숫자로 파일 이름을 바꾸려면 이름 바꾸기 명령을 사용하십시오.

확장자를 유지하면서 0으로 채워진 숫자로 파일 이름을 바꾸려면 이름 바꾸기 명령을 사용하십시오.

확장자를 유지하면서 0으로 채워진 숫자로 파일 이름을 바꾸고 싶습니다.

a.abc
b.cde
c.xyz


001.abc
002.cde
003.xyz 로 이름을 바꿉니다.

:~/x$ rename -n -v 's/.+/our $i; sprintf("%03d.jpg", 1+$i++)/e' *
#output>
rename(a.abc, 001.jpg)
rename(b.cde, 002.jpg)
rename(c.xyz, 003.jpg)
#then
:~/x$ echo "a.abc"
a.abc
:~/x$ echo ${_##*.}
#output>
abc
so I tried>
:~/x$ rename -n -v 's/.+/our $i; sprintf("%03d.${_##*.}", 1+$i++)/' *
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at (user-supplied code).
Missing right curly or square bracket at (user-supplied code), within string
syntax error at (user-supplied code), at EOF

사용 제안 사항"이름 바꾸기"주문하다?

답변1

rename -n -v 'our $n; my $zn=sprintf("%03d", ++$n); s/[^.]*/$zn/' *

이는 예상한 대로 작동할 수 있습니다. Perl 코드를 배치하는 대신~에교체하고 실행해보겠습니다앞으로대리자.

정규식은 [^.]*파일 이름의 첫 번째 점까지(포함하지 않음) 문자열 길이와 일치합니다.

일치시키기 위해마지막점을 지정하고 대체를 사용 .*\.하고 대체 측면에 점을 삽입합니다.

rename -n -v 'our $n; my $zn=sprintf("%03d", ++$n); s/.*\./$zn./' *

이렇게 하면 디렉터리 이름도 변경됩니다.


*또는 쉘 glob이 파일을 확장하는 순서대로 파일을 열거 한다고 가정하고 간단한 쉘 루프를 사용하고 다음을 사용하십시오 bash.

n=1
for filename in *; do
    [ ! -f "$filename" ] && continue
    zn=$( printf '%03d' "$n" )
    mv -i -- "$filename" "$zn.${filename##*.}"
    n=$(( n + 1 ))
done

또한 일반 파일(또는 해당 파일에 대한 심볼릭 링크)을 참조하지 않는 이름은 건너뜁니다. 그 밖에도 다음과 같은 것들이 있다아주 근접한카운터( )와 0으로 채워진 카운터 변형( )을 rename유지하는 위의 Perl 변형입니다 .nzn

변수 n는 간단한 카운터이며 $zn와 동일한 값을 갖지만 $n0으로 채워진 세 자리 숫자입니다.

값은 $zn.${filename##*.}0으로 채워진 숫자로 확장되고 그 뒤에 점과 원래 파일 이름의 최종 파일 이름 접미사가 옵니다. 원본 파일 이름에 점이 여러 개 있는 경우마지막점이 0으로 채워진 숫자로 대체됩니다. 대부분을 대체 ##하도록 변경#첫 번째가리키다.

이는 현재 디렉터리의 파일에서만 루프를 실행한다고 가정합니다.

답변2

넌 할 수있어

rename -n -v 'our $i; s{^\./.+?(\.[^.]*)?\z}{sprintf "%03d%s", ++$i, $1}se' ./*
  • ./접두사 : ./*일부 변형에는 rename필수이고 , 그렇지 않은 경우에는 필수입니다 -.
  • .+?.: 선행 (숨겨진 파일의 경우 dotglob쉘 옵션이 활성화된 경우에만 해당)이 확장 구분 기호로 처리되는 것을 원하지 않기 때문에 최소한 하나의 문자와 일치합니다 .
  • (\.[^.]*)?:또한 확장자 없이 파일 이름을 바꿉니다(예: .foo또는 foo).
  • \z: 주제의 끝 부분과 일치합니다. 보다 일반적으로 , 주제의 끝이나 후행 개행 앞에 일치하기 때문에 rename사용하고 싶지 않습니다 .$
  • s.플래그: 파일 이름의 모든 문자만큼 유효한 개행 문자도 일치하는지 확인하세요 .
  • eflag:replacement는 Perl 표현식이므로 sprintf여기서 사용할 수 있습니다.

관련 정보