我有一个目录,其中包含以模式命名的文件:
[HorribleSubs] One Piece - 01 [1080p].mkv
[HorribleSubs] One Piece - 02 [1080p].mkv
这些文件最多可达 700 个。
我希望这些文件被重命名为
One Piece 001.mkv
One Piece 002.mkv
等等。我是 Linux 新手,需要帮助解决这个问题。
答案1
使用zsh
shell(不幸的是 Ubuntu 上默认情况下未安装,您需要运行apt install zsh zsh-doc
为root
):
$ autoload -Uz zmv
$ zmv -n '\[*\] (* - )(<->) \[<->p\](.mkv)' '$1${(l[3][0])2}$3'
mv -- '[HorribleSubs] One Piece - 01 [1080p].mkv' 'One Piece - 001.mkv'
mv -- '[HorribleSubs] One Piece - 02 [1080p].mkv' 'One Piece - 002.mkv'
(-n
如果对结果满意,请删除(试运行))。
或者与包中的rename
aka命令相同(基于 - 的实现之一):file-rename
rename
perl
rename
$ rename -n 's{^\[.*\] (.* - )(\d+) \[\d+p\](\.mkv)\z}{
sprintf "%s%03d%s", $1, $2, $3}se' \[*.mkv
rename([HorribleSubs] One Piece - 01 [1080p].mkv, One Piece - 001.mkv)
rename([HorribleSubs] One Piece - 02 [1080p].mkv, One Piece - 002.mkv)
这两种方法之间的一些等效项:
*
/.*
:匹配 0 个或多个字符。<->
/\d+
:匹配 1 个或多个 ASCII 十进制数字。在 中zsh
,您还可以用来<1-700>
限制它匹配的数字范围。$1
,$2
,$3
: 替换中的扩展为(...)
模式中对应的捕获内容。l[3][0]
/printf "%03d"
:l
ef-pads 到 的3
长度0
。
1 实际上rename
是 0 或更多字节,它很可能会破坏中间的一些字符。不过,要在这里发生这种情况,您需要将文件名编码在字符映射中,例如东亚某些地区使用的 BIG5、GBK、GB18030,这些字符确实有几个字符,其编码包含]
.另请注意,s
如果没有该标志,则.
在字节 0xa 上将不匹配(换行符的编码)
答案2
如果您的文件都遵循确切的模式,您可以rename
在 Ubuntu 上使用,如下所示:
$ rename -n 's/.*- (\d+).*/"One Piece " . sprintf("%.3d",$1) . ".mkv"/e' *mkv
[HorribleSubs] One Piece - 01 [1080p].mkv -> One Piece 001.mkv
[HorribleSubs] One Piece - 02 [1080p].mkv -> One Piece 002.mkv
如果看起来正确,请删除-n
实际重命名文件的选项。