如何使用格式错误的编号批量重命名文件?

kra*_*mir 3 rename

我有一堆编号格式错误的文件:

prefix-#.ext       | for files with number 1-9
prefix-##.ext      | for files with number 10-99
prefix-###.ext     | for files with number 100-999
Run Code Online (Sandbox Code Playgroud)

由于进一步处理,我需要他们所有的名字都采用以下格式:prefix-###.ext. 有没有简单的方法可以做到这一点?

Gil*_*il' 5

在 Debian、Ubuntu 和衍生产品上,您可以使用renamePerl 脚本

rename 's/(?<=-)([0-9]+)/sprintf "%03d", $1/e' prefix-*.ext
Run Code Online (Sandbox Code Playgroud)

某些系统可能将此命令安装为prenameperl-rename。请注意,这不是renameutil-linux 套件中的实用程序,它没有提供一种简单的方法来执行此操作。

在 zsh 中,您可以使用zmv重命名和l 参数扩展标志来填充零。

autoload -U zmv
zmv '(prefix-)(*)(.ext)' '$1${(l:3::0:)2}$3'
Run Code Online (Sandbox Code Playgroud)

你也可以用一个普通的 shell 循环来做到这一点。Shell 没有很好的字符串操作结构;用零填充的一种方法是添加 1000 并去除前导1.

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}; n=$((n+1000))
  mv "$x" "${x%-*.ext}${n#1}${x##*-}"
done
Run Code Online (Sandbox Code Playgroud)

另一种方法是调用printf实用程序。

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}
  mv "$x" "${x%-*.ext}$(printf %03d "$n")${x##*-}"
done
Run Code Online (Sandbox Code Playgroud)