我有一个目录,其中包含编号的图像文件,如下所示:
01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png
有时,一个文件可能有不同格式的多个版本(例如,上面的和文件的 apng
和svg
版本),但数字是连续的。通常每个目录中有 40-80 个这样的文件。这些数字对应于这些图像在手稿(Word 文档,但这并不重要)中出现的顺序。没有其他方法可以确定图像的顺序。03
09
如果我将新图像添加到手稿中,我需要将该图像的副本放置在该目录中并具有正确的编号。因此,如果新图像是手稿中的第五个图像,我需要将目录中的文件重命名为此,以便为其腾出空间:
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。
答案1
我认为它应该完成以下工作:
#!/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
脚本采用一个参数 - 新图像的编号。
附言。将脚本放在图像之外的另一个目录中。在图像目录中应该只有以您描述的方式命名的图像。
答案2
在 zsh 中这会更容易,您可以在其中使用
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
答案3
最近似乎对这个问题没有太多兴趣,但是,如果有人偶然发现它,这里存在三个问题。
一是如何根据语义标准选择要重命名的文件(范围不是词汇的,不能用通配符甚至正则表达式指定——自动机理论认为这比 NFA 更复杂)。
第二个是如何通过修改名称的一部分来更改名称。
第三是如何避免名称冲突。
Bash 和许多其他语言中的脚本可以完成这种特定的转换,但我们大多数人宁愿不必每次想要重命名一堆文件时都编写一个程序。
使用我的(免费和开源),rene.py
您可以做您想做的事情,但需要两次调用才能避免名称冲突问题。
- 第一的
递增范围内的所有名称,添加前缀rene ?.*/#7-80 %?.* B
%
以避免现有名称。 - 然后
从具有该前缀的文件中删除该前缀。rene %* *
我对此进行了描述https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/
答案4
这个确切的问题包含在本文。请注意,您必须通过添加第二个 MV 步骤来修改它以支持 SVG 和 PNG 格式。