我有一些名为 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
是用零填充的四位数字,后跟一个句点。