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

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

我有一堆编号格式不正确的文件:

prefix-#.ext       | for files with number 1-9
prefix-##.ext      | for files with number 10-99
prefix-###.ext     | for files with number 100-999

由于进一步处理,我需要将它们的所有名称采用以下格式:prefix-###.ext。有什么简单的方法可以做到这一点吗?

答案1

在 Debian、Ubuntu 及其衍生版本上,您可以使用renamePerl脚本:

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

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

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

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

您也可以使用普通的 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

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

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

答案2

也许是这样的(未经测试)

for n in *.ext; do
    echo mv "$n" \
      "prefix-$(printf %03d "$(basename ${n#prefix-} .ext)").ext"
done

删除 来echo进行实际的重命名。

注意:您必须位于文件所在的目录中才能使此方法起作用;处理包含目录部分的路径名更为复杂。

答案3

for file in prefix-*.ext
do
    num=`echo $file | sed 's/prefix-\(.*\).ext/\1/'`
    [ $num -lt 100 ] && mv $file prefix-`printf "%03d" ${num}`.ext
done

相关内容