如何增加重命名命令中的变量值

如何增加重命名命令中的变量值

我想将文件重命名为递增数字格式,如下所示:

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-basedrename和 basic shell,你可以做一些接近的事情(没有原始列表的数字排序,也没有保护措施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")

相关内容