名前変更コマンドで変数値を増やす方法

名前変更コマンドで変数値を増やす方法

ファイル名を次のように昇順の数値形式に変更したいと思います。

04.jpg
05.jpg
06.jpg

したがって、変数の値を増やし、それに渡す方法を考える必要がありますrename。インターネットで次のように指示します。

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

要点は、これがどのように機能するのか理解していないということです。これまでは、これは名前の変更のために不明な変数への参照を渡すour $iことに応答すると推測できます。$i次に、部分的に1つを追加します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-basedrenameとデフォルトのシェルを使用すると、同様の操作を実行できます(元のリストの数値ソートとプロテクターなし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")

関連情報