我遇到以下情况:
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
的 替换为。file
file0
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
匹配一个数字。