批量/多重命名特定编号范围内的文件

批量/多重命名特定编号范围内的文件

我遇到以下情况:

file01.ext
.
.
.
file99.ext
file100.ext
.
.
.

并且我想(使用重命名)为文件 01-99 插入“0”(以便它们变成 000-099)但不修改大于 100 的文件。我应该使用哪个表达式,什么是学习此类正则表达式的良好来源?

在 Windows 上,我会使用 Total Commander 的多重重命名功能,该功能具有非常简单的重命名语法。Ubuntu 上有没有该工具(多重重命名)的替代品?

答案1

使用rename

此类活动通常有用的工具rename来自perl软件包。它将 perl 替换应用于文件名:

rename 's/file/file0/' file[0-9][0-9].ext

工作原理:

  • s/file/file0/

    这是一个替换命令。它将文件名中perl的 替换为。filefile0

  • file[0-9][0-9].ext

    rename这是要操作的 文件列表。[0-9]表示从 0 到 9 的任意数字。 [0-9][0-9]表示任意两个数字,一个接一个。

的手册页rename这里

笔记:这需要perl的版本rename。还有一个rename公用事业这是其中的一部分util-linux,但是其工作原理不同。

使用bash

这种方法使用for循环结合模式替换

for f in file[0-9][0-9].ext; do mv "$f" "${f/file/file0}"; done

怎么运行的:

  • for f in file[0-9][0-9].ext; do

    这将对与 glob 匹配的每个文件名启动一个循环file[0-9][0-9].ext

  • mv "$f" "${f/file/file0}"

    这将使用 bash 的模式替换. 它将file文件名中的 替换为 file0`。

  • done

    这标志着循环的结束for

这种方法需要bash(或其他高级shell)。

bash是默认的交互式 shell,此方法将在 下工作bash。因此,这应该在通常的命令行上工作。

答案2

使用不同的正则表达式进行重命名:

rename -n 's/[^0-9](([0-9]){2})\.ext$/0$1.ext/' *

[^0-9](([0-9]){2})\.ext$匹配任何非数字[^0-9],后跟长度为 2 且以 结尾的数字组.ext。因此,在替换部分,添加0并打印匹配的组$1,然后打印它们的扩展名。

或者正则表达式的替代方案:

rename -n 's/[^\d](\d{2})\.ext$/0$1.ext/' *

\d匹配一个数字。

相关内容