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

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

我有一些名为 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

答案1

如果您没有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

答案2

使用 Perl 的重命名实用程序:

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

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

类似 Debian 的发行版等都默认安装了 Perl 的 rename/prename。如果您的发行版没有,可以找到安装说明这里

(向 Steeldriver 致敬,改进了该命令的版本。)

例子

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

$ ls
A12345.txt  A123.txt  A12.txt  A1.txt

现在,让我们运行 prename:

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

怎么运行的

使用单个替代命令:

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

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

相关内容