如何将一批文件名中的序列号重新格式化,例如A1.txt 到A0001.txt?

Chr*_*tin 3 osx bash shell-script rename

我有一些名为 A1.txt A2.txt ... A11.txt A12.txt 等的文件。我想将它们重命名为 A0001.txt A0002.txt ... A0011.txt 等。我这样做对吗?

for file in A*.txt
do
mv ${file} ${file/-#.txt-/-"%5d".txt}
done
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 6

如果您没有prename@John1024 建议的选项,您应该能够使用printf(内置的bash,但也可以从 GUN 获得coreutils)使用所需的字段宽度和填充来格式化十进制数字 - 不幸的是我没有不认为有一步shell扩展来提取数字,我能得到的最接近的是

for file in A*.txt
do
  base="${file%.*}"
  printf -v newfile "A%04d.txt" "${base#A}"
  mv -- "$file" "$newfile"
done
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 5

使用 Perl 的重命名工具:

prename 's/(\d+)\./sprintf "%04d.", $1/e' A*.txt
Run Code Online (Sandbox Code Playgroud)

prename有时可以在名称下使用rename。但是,rename在某些发行版上默认安装了另一个不相关且不兼容的实用程序。

默认情况下,类似 Debian 的发行版安装了 Perl 的重命名/预命名。如果您的发行版没有,可以在此处找到安装说明

(向 Steeldriver 提供改进版命令的帽子提示。)

例子

考虑一个包含这些文件的目录:

$ ls
A12345.txt  A123.txt  A12.txt  A1.txt
Run Code Online (Sandbox Code Playgroud)

现在,让我们运行 prename:

$ prename 's/(\d+)\./sprintf "%04d.", $1/e' A*.txt
$ ls
A0001.txt  A0012.txt  A0123.txt  A12345.txt
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

使用单个替代命令:

s/(\d+)\./sprintf "%04d.", $1/e
Run Code Online (Sandbox Code Playgroud)
  • (\d+)\.匹配一个或多个数字后跟一个句点。数字保存在组 1 中。

  • 最后e告诉 perl 评估命令sprintf "%04d.", $1。此命令以表示用%04d零填充的四位数字,后跟一个句点的格式返回组 1 的数字。