이름 바꾸기 명령에서 변수 값을 늘리는 방법

이름 바꾸기 명령에서 변수 값을 늘리는 방법

파일 이름을 다음과 같이 오름차순 숫자 형식으로 바꾸고 싶습니다.

04.jpg
05.jpg
06.jpg

그래서 변수 값을 증가시키고 이를 에 전달하는 방법을 생각해 내야 합니다 rename. 인터넷에서 다음과 같이 지시합니다.

rename -n 'our $i; s/\d+/sprintf("new\/%03d", $i++)/e' *.*

요점은 이것이 어떻게 작동하는지 이해하지 못한다는 것입니다. 지금까지는 이것이 이름 바꾸기를 위해 알 수 없는 변수에 대한 참조를 our $i전달하는 데 응답할 것이라고 추측할 수 있습니다 . $i그런 다음 부분적으로 하나를 추가합니다 sprintf("new\/%03d", $i++). 이 결론을 바탕으로 나는 다음을 시도하기로 결정했습니다.

i=4
rename -n 'our $i; s/\d+/sprintf("new\/%03d", $i++)/e' *.*

그러나 그것은 실패했습니다. $i이름 바꾸기가 예상대로 작동 하도록 시작 값을 어떻게 설정합니까 ?

답변1

그리고 zsh:

autoload zmv
n=0; zmv -n '*.jpg(#qn[1,100])' 'new/${(l[2][0])$((++n))}.jpg'

최대 100개의 JPEG 파일 이름을 바꿀 수 있습니다(목록은 숫자순으로 정렬됨).

( -n원하는 경우 시험 실행을 위해 삭제하세요).

perl-based rename및 기본 셸을 사용하면 비슷한 작업을 수행할 수 있습니다(원본 목록의 숫자 정렬 및 보호 장치 없음 zmv).

rename -n '
  our $i //= 1;
  exit if $i > 100;
  $_ = sprintf "new/%02d.jpg", $i++' ./*.jpg

renameperl을 사용하여 루프의 각 파일에 대해 지정된 코드를 실행합니다 $_. 코드는 $_파일의 새 이름으로 변경됩니다.

our $i범위는 여기에서 정의됩니다 $i. 당신이 원하지 않는현지의한 파일에서 다음 파일까지 기억하려는 델타 값의 범위입니다 my $i(자세한 내용 참조).$iourperldoc -f our

Perl 구성 s/regexp/replacement/flags$_. 처음부터 대체 이름을 만드는 경우 여기에는 필요하지 않습니다.

답변2

이것. 시작 인덱스는 첫 번째 매개변수로 제공될 수 있습니다.

perl -le '
  my $i=shift;
  my $w=length(@ARGV+$i);
  -f $_ and
rename($_,sprintf("new/%0${w}d.jpg",$i++))
  or  die("moving $_:$!")
      for @ARGV;
' 4 ./*.jpg

tree -F

산출

Before renaming step...
.
├── food1.jpg
├── food2.jpg
├── food3.jpg
├── food4.jpg
├── food5.jpg
├── food6.jpg
├── food7.jpg
├── food8.jpg
├── food9.jpg
├── infile
├── new/
└── x

After renaming step....

.
├── infile
├── new/
│   ├── 04.jpg
│   ├── 05.jpg
│   ├── 06.jpg
│   ├── 07.jpg
│   ├── 08.jpg
│   ├── 09.jpg
│   ├── 10.jpg
│   ├── 11.jpg
│   └── 12.jpg
└── x

답변3

존재하다bash

#!/bin/bash
for f in `find . -type f -name "[0-9]*.jpg" -printf "%f\n" | sort -r`; do
    # Take the prefix (01.jpj --> 01)
    index="${f%.*}"

    # Remove the leading zero if have it
    index="${index#0*}"

    # add one to the index
    index=$((index+1))

    # Add again the leading zero if we are under the double
    [ "$index" -gt 10 ] || index="0$index"

    # Rename
    mv "$f" "$index.jpg"
done

또는 동일한 방법이지만 다음을 사용합니다 python3.

#!/usr/bin/python3
import os
import re

all_file = [ _[:_.index(".")] for _ in os.listdir() if re.match(r'^\d+(?=\.jpg$)', _)]
all_file.sort(reverse=True)

for ftr in all_file:
    ni = "0" + str(int(ftr) + 1) if int(ftr) < 9 else str(int(ftr) + 1)
    os.rename(ftr + ".jpg", ni + ".jpg")

관련 정보