通过增加文件名中的数字来重命名文件

rob*_*rtc 20 bash rename

我有一个包含编号图像文件的目录,如下所示:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png
Run Code Online (Sandbox Code Playgroud)

有时可出现不同格式文件的多个版本(例如一png和svg版本03和09文件以上),但数字是连续的,否则。通常每个目录中有 40-80 个这样的文件。这些数字对应于这些图像在手稿(Word 文档,但这并不重要)中出现的顺序。没有其他方法可以确定图像的顺序。

如果我在手稿中添加新图像,我需要在此目录中放置一个具有正确编号的图像副本。因此,如果新图像是手稿中的第五张,我需要将目录中的文件重命名为这个,以便为它腾出空间:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png
Run Code Online (Sandbox Code Playgroud)

从命令行或脚本或宏重新编号从某个数字开始的所有文件的最直接方法是什么?我有一个使用 bash 的标准 Fedora Linux 安装。

pbm*_*pbm 17

我认为它应该做的工作:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done
Run Code Online (Sandbox Code Playgroud)

脚本采用一个参数 - 新图像的数量。

附注。将脚本放在另一个目录而不是图像中。在图像目录中,应该只有以您描述的这种方式命名的图像。


Gil*_*il' 5

这在 zsh 中会更容易,您可以在其中使用

  • 在On 水珠预选赛进行排序比赛按递减顺序(和n使用数字顺序,以防文件名不会都前导零的宽度相同);
  • 的(l:WIDTH::FILLER:) 参数扩展标志到垫的所有数值为相同的宽度(较大的数的宽度)。
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done
Run Code Online (Sandbox Code Playgroud)

在 bash 中,这里有一个脚本,它假定文件被填充到固定宽度(否则,脚本不会重命名正确的文件)并填充到固定宽度(必须指定)。

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done
Run Code Online (Sandbox Code Playgroud)