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


14

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

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

有时,文件的多个版本可能具有不同的格式(例如上述和文件的pngsvg版本),但数字是连续的。通常,每个目录中有40-80个此类文件。这些数字与这些图像在原稿(Word文档中的顺序,但并不重要)中出现的顺序相对应。没有其他方法可以确定图像的顺序。0309

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

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

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

Answers:


11

我认为它应该做的工作:

#!/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

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

PS。将脚本放在图像之外的其他目录中。在images目录中,应该只存在您所描述的以此方式命名的图像。


这看起来很有希望,我将在几小时后再回到笔记本电脑上尝试一下。
robertc 2012年

仅当您的文件名没有以非数字字符作为前缀时,此方法才有效
mems

@mems OP明确指出文件名以数字开头
xhienne

2

这在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

在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

1

这种精确的问题是覆盖在这篇文章。请注意,您必须通过添加第二个MV步骤来修改它以支持SVG和PNG格式。


我不认为这是确切的问题,每次都会重新编号所有图像。我只想从特定点重新编号图像。
robertc 2012年


1

最近似乎对该问题没有太大兴趣,但是,如果有人偶然发现了这个问题,这里有三个问题。一种方法是根据语义标准选择文件进行重命名(范围不是词法,并且不能由通配符或正则表达式指定-自动机理论认为这比NFA更复杂)。第二个是如何通过修改名称的一部分来更改名称。第三是如何避免名字冲突。用Bash和许多其他语言编写的脚本可以执行此特定转换,但是我们大多数人宁愿不必在每次要重命名文件时都编写程序。使用我的(免费和开放源代码)rene.py,您可以执行所需的操作,但是需要两次调用才能避免名称冲突问题。第一rene ?.*/#7-80 %?.* B增加该范围内的所有名称,并添加%的前缀以避免现有名称。然后rene %* *从具有该前缀的那些文件中删除该前缀。我在https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.