확장자를 유지하면서 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 변형입니다 .n
zn
변수 n
는 간단한 카운터이며 $zn
와 동일한 값을 갖지만 $n
0으로 채워진 세 자리 숫자입니다.
값은 $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
.
플래그: 파일 이름의 모든 문자만큼 유효한 개행 문자도 일치하는지 확인하세요 .e
flag:replacement는 Perl 표현식이므로sprintf
여기서 사용할 수 있습니다.