파일 이름의 특정 지점에 4자리 숫자로 구성된 인덱스가 있는 파일 목록의 번호를 다시 매기려고 합니다. 이러한 파일은 항상 0001에서 출력을 시작하지만 1001부터 시작해야 합니다.
./file_name.0001.jpg
~해야 한다./file_name.1001.jpg
./file_name.0734.jpg
~해야 한다./file_name.1734.jpg
- 등.
나는 이것을 접했지만 rename
Perl에 익숙하지 않습니다. 예를 개선하면 다음과 같이 작동할 것이라고 생각합니다.
rename -n 's/\d{4}/our $i //= 1001; ++$i/e' -- *.jpg
불행히도, 증가할 때쯤에는 $i를 잊어버린 것 같습니다.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at (user-supplied code).
파일 이름을 이미 존재하는 이름으로 바꾸는 것도 안전하지 않지만 어디로 갈지는 모르겠습니다.
답변1
여기서는 숫자에 1000을 더할 수 있어야 하는 것 같습니다.
rename -n -- 's/\d{4}/$& + 1000/e' *.jpg
에서는 일치 \d{4}
합니다 . 4자리 이상의 시퀀스를 일치시키려면 다른 숫자로 둘러싸여 있지 않은지 확인해야 합니다 .1234
1234567
\d{4}
rename -n -- 's/(?<!\d)\d{4}(?!\d)/$& + 1000/e' *.jpg
특히 문제는 /
구분 기호를 사용 s
하고 /
교체 내부에서 사용한다는 것입니다. 대체에 코드가 포함된 경우 s{pattern}{replacement}flags
Substitute 를 좋아 s/pattern/replacement/flags
하지만 언제든지 다음과 같은 다른 역할을 사용할 수 있습니다.s:pattern:replacement:flags
rename -n -- 's{\d{4}}{our $i //= 1000; ++$i}e' *.jpg
아마도 더 나은 대안은 이름을 바꾸기 전에 온전한지 확인하는 이점이 있는 's 를 rename
사용하는 것입니다 .zsh
zmv
autoload -Uz zmv
i=1000; zmv -n '(*)[0-9](#c4)(*.jpg)' '$1$((++i))$2'
또는 4개 이상의 숫자를 찾으세요:
i=1000; zmv -n '(|*[^0-9])[0-9](#c4)(([^0-9]*|).jpg)' '$1$((++i))$2'
또는 숫자에 1000을 추가하십시오.
zmv -n '(*)([0-9](#c4))(*.jpg)' '$1$(($2 + 1000))$3'
<0-999>
1, 01, 0001, 000000001...을 포함하여 0에서 999 사이의 숫자를 나타내는 일련의 숫자 와 일치합니다. (<0-999>~^[0-9](#c4))
0부터 999까지의 4자리 숫자와 일치합니다.