我想重命名许多文件,命名如下:
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-rename
(rename
在基于 Debian 的系统上调用,包括 Ubuntu),您可以执行以下操作:
rename -n 's/\d+.mp3$/sprintf("%06d",$c++) . ".mp3"/e' *mp3
解释
- 导致仅打印它将执行的操作,而不重命名任何内容
-n
。rename
一旦您确定该命令执行了您想要的操作,请将其删除。 s/foo/bar/e
:这是替换运算符;它将替换foo
为bar
.最后的会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")