如何在 Ubuntu 上批量重命名大量文件?

如何在 Ubuntu 上批量重命名大量文件?

我有一个目录,其中包含以模式命名的文件:

[HorribleSubs] One Piece - 01 [1080p].mkv
[HorribleSubs] One Piece - 02 [1080p].mkv

这些文件最多可达 700 个。

我希望这些文件被重命名为

One Piece 001.mkv
One Piece 002.mkv

等等。我是 Linux 新手,需要帮助解决这个问题。

答案1

使用zshshell(不幸的是 Ubuntu 上默认情况下未安装,您需要运行apt install zsh zsh-docroot):

$ 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如果对结果满意,请删除(试运行))。

或者与包中的renameaka命令相同(基于 - 的实现之一):file-renamerenameperlrename

$ 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": lef-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实际重命名文件的选项。

相关内容