如何替换大量文件名中的一列数字

如何替换大量文件名中的一列数字

我想重命名许多文件,命名如下:

cc cc nn - ccccccc ccc cccccccc - nnnnnn.mp3

其中“c”表示字符,“n”表示数字

cc cc nn - ccccccc ccc cccccccc - nnnnnn.mp3
                                  ^^^^^^ these (^) are the numbers I want to change.

我想要数字像 000001, 000002, ... , 084521

我使用的是linux,所有常用的命令行工具都可用。

基本上我想用它正在计数的数字替换文件名的位置 35-​​40。

答案1

如果您有perl-renamerename在基于 Debian 的系统上调用,包括 Ubuntu),您可以执行以下操作:

rename -n 's/\d+.mp3$/sprintf("%06d",$c++) . ".mp3"/e' *mp3

解释

  • 导致仅打印它将执行的操作,而不重命名任何内容-nrename一旦您确定该命令执行了您想要的操作,请将其删除。
  • s/foo/bar/e:这是替换运算符;它将替换foobar.最后的会e导致运算符右侧内的任何命令被评估并被其输出替换。
  • \d+.mp3$.mp3:匹配以文件名 ( )结尾的最长的一段数字$
  • sprintf("%06d",++$c) . ".mp3":该sprintf命令将打印变量 的内容$c,加 1 后,前面有 6 个 0。由于$c命令第一次运行时未初始化,因此++$c将变为 1。然后将其与 串联起来.mp3

所有这一切的最终结果将是将扩展之前的数字替换为递增的、以 0 填充的数字:

$ rename -n 's/\d+.mp3$/sprintf("%06d",++$c) . ".mp3"/e' *mp3
cc cc nn - ccccccc ccc cccccccc - 123401.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000001.mp3
cc cc nn - ccccccc ccc cccccccc - 123402.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000002.mp3
cc cc nn - ccccccc ccc cccccccc - 123403.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000003.mp3
cc cc nn - ccccccc ccc cccccccc - 123404.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000004.mp3
cc cc nn - ccccccc ccc cccccccc - 123405.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000005.mp3
cc cc nn - ccccccc ccc cccccccc - 123406.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000006.mp3
cc cc nn - ccccccc ccc cccccccc - 123407.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000007.mp3
cc cc nn - ccccccc ccc cccccccc - 123408.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000008.mp3
cc cc nn - ccccccc ccc cccccccc - 123409.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000009.mp3
cc cc nn - ccccccc ccc cccccccc - 123410.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000010.mp3
cc cc nn - ccccccc ccc cccccccc - 123411.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000011.mp3
cc cc nn - ccccccc ccc cccccccc - 123412.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000012.mp3
cc cc nn - ccccccc ccc cccccccc - 123413.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000013.mp3
cc cc nn - ccccccc ccc cccccccc - 123414.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000014.mp3
cc cc nn - ccccccc ccc cccccccc - 123415.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000015.mp3
cc cc nn - ccccccc ccc cccccccc - 123416.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000016.mp3
cc cc nn - ccccccc ccc cccccccc - 123417.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000017.mp3
cc cc nn - ccccccc ccc cccccccc - 123418.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000018.mp3
cc cc nn - ccccccc ccc cccccccc - 123419.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000019.mp3
cc cc nn - ccccccc ccc cccccccc - 123420.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000020.mp3

答案2

作为 shell 脚本:

tempdir="$(mktemp -d)"
i=0; for file in *.mp3; do
  i=$((i+1))
  mv -- "$file" "$tempdir/${file%%[0-9]*.mp3}$(printf '%06d.mp3' "$i")"
done
mv "$tempdir"/* . && rmdir "$tempdir"

在 mp3 目录中运行此脚本。它将创建一个临时目录并将重命名的文件移动到该目录,以避免重命名为已存在的文件名。处理完所有文件后,文件将移回当前目录。

循环访问文件名时,从文件名中${file%%[0-9]*.mp3}删除现有后缀,并向目标文件名添加新的零前缀后缀。nnnnnn.mp3$(printf '%06d.mp3' "$i")

相关内容