#文件重命名 #命令行 #正则表达式 #命令行工具 #分组 #捕获 #批量

app nora_rename

用于批量重命名文件的高级正则表达式控制命令行工具

2 个版本 (1 个稳定版)

1.0.0 2023年7月29日
0.1.3 2023年1月29日

#904 in 命令行工具

MIT 许可证

54KB
1.5K SLoC

Rust

文档

什么是Nora?

Nora是一个用于使用正则表达式进行批量文件重命名的高级控制命令行工具。它使用仅为此目的创建的自定义语言。任何建议都欢迎(通过GitHub问题反馈)

如何安装

使用cargo

cargo install nora_rename

其他方法即将推出

用法

命令行用法

nora [OPTIONS] <INPUT> <OUTPUT>

选项

命令 描述
-h | --help 打印帮助信息
-s | --skip 跳过重命名预览并直接重命名文件
-V | --version 打印版本信息
-p | --pretty_print 以更易于阅读的格式输出
-g | --global 从捕获中删除全局匹配

输入

输入是正则表达式。可以使用捕获组(有关在输出中使用它们的说明,请参见此处)

命名捕获组也适用(有关在输出中使用它们的说明,请参见此处)

输出

输出表达式是一种易于使用的简单语言

以下两个概念非常重要:不变部分和解释部分

不变部分在重命名时不会改变,而解释块中的任何内容都将根据此示例进行解释

[#1].txt

不变部分是 .txt 解释块以 [ 开头并以此结束,在这种情况下,解释块是 [#1],其中包含 #1

解释块可以有以下表达式


循环语句

示例

[for x in 0.#cap_count { #x }]

这将从0遍历到#cap_count,该值被评估为捕获的数量。

可以使用#x来获取具有值x的捕获组。

如果x是0,它将获取#0(第一个捕获组)等等。

注意:这通常与-g选项一起使用,因为否则将包括所有捕获,这可能会弄乱事情。

三元表达式

示例

[#1 == 10 ? 1 : 2]

根据条件,如果条件为真,则返回1,否则返回2。

条件运算符可以是以下任何一种:==!=<<=>>=

三元第二参数跳过

如果您想将三元运算符作为正常的if语句使用,以在条件为真时写入某些内容,但条件不为真时则不写入,示例:

[#1 == 10 ? "something" : ""]

跳过运算符可以用来简化此示例

[#1 == 10 ?> "something"]

数学表达式

示例

[10 + 20]

目前支持的操作包括 +-*/**//()

**:幂运算符 //:对数运算符

重要的是要注意,只有当左参数是数字时,数学表达式才会被解释为数学表达式。

例如

["10" + 20]

这将给出1020,因为它会将左侧转换为字符串并执行连接。

[10 + "20"]

这将给出30,因为左侧是数字,它将自动将其转换为数字。

字符串操作

连接

示例

["hello " + "world"]

重要的是要注意,只有当左参数是字符串时,才会发生字符串连接。

例如

["10" + 20]

这将给出1020,因为它会将左侧转换为字符串并执行连接。

[10 + "20"]

这将给出30,因为左侧是数字,它将自动将其转换为数字。

减法

示例

["testes" - "te"]

这将给出输出stes,它移除了找到的第一个te

多次减法

示例

["testes" -- "te"]

这将给出输出ss,它移除了找到的所有te

标识符

标识符是解释器中的变量和正则表达式示例

[#1]
[foo]
[bar]
[#count]

这些都是变量,以#开头的变量是保留给解释器的(这意味着您的捕获组不应该以#开头)。

使用捕获组

当使用正则表达式时,可以像以下这样在解释器块中使用捕获组

[#0]
[#1]
...
[#n]

数字代表顺序中的捕获组。

重要的是要注意,#0是整个正则表达式捕获,因此为了使用第一个捕获组,它将是#1

这是仅当全局参数为假时才为真,如果全局为真,则#0将是第一个捕获组

使用命名捕获组

使用命名捕获组与正常捕获组类似。唯一的区别是省略开头的#

例如,如果命名捕获组是test,它将被如下使用

[test]

导入注意:当使用任何捕获组或命名捕获组标识符时,它们默认都是字符串。

当数学表达式中的参数是左侧参数时,必须将它们转换为数字

字符串转换

示例

[string(#1)]

将括号内的表达式转换为字符串

数字转换

示例

[number(#1)]

将括号内的表达式转换为数字。第二个参数还可以控制小数位数

[number(10.532, 2)]

结果将是10.53

示例用法

将文件重命名为 (number).txt 为 (number).mkv

nora '(\d+)\..*' '[#1].mkv'

将文件重命名为 (number).txt 为 (number + 10).txt

nora '(\d+)\..*' '[number(#1) + 10].txt'

如果 (number) 为 0,则将 (number>.txt 重命名为 (number + 10).txt,否则保持为 (number).txt

nora '(\d+)\..*' '[#1 == 0 ? number(#1) + 10 : #1].txt'

移除文件名中的空格

例如,如果我们有这个文件名 1 2 3 4 5.txt

如果我们想移除空格,可以使用循环和-g选项来移除整个捕获

使用这个正则表达式 ([^\s]+)\s?([^\s]+)? 它匹配所有空格之外的内容,因此我们可以循环使用 #cap_count 给出的捕获组数量,将它们重新连接起来

您可以通过这里查看正则表达式的效果 https://www.debuggex.com/r/9bUMa4OHscE8TyvR

nora -g '([^\s]+)\s?([^\s]+)?' '[for x in 0.#cap_count { #x }]'

循环将从 0 到 #cap_count,这将是找到的捕获的数量

#x 将获取捕获组 x 的内容,因此如果 x 为 0,它将类似于执行 #0

这将导致文件被重命名为 12345.txt

依赖关系

~4–6MB
~103K SLoC