跳转到主要内容

使用正则表达式匹配来重命名文件。这可以通过单个命令优雅地处理多个重命名。

项目描述

rename

PyPI - Version PyPI - Python Version code style - black types - Mypy Hatch project


使用正则表达式匹配来重命名文件。这可以通过单个命令优雅地处理多个重命名。

目录

安装

该脚本是一个单独的文件,与任何Python 3.7+兼容。如果您愿意,可以使用以下命令安装:

控制台pip安装rename

曾经有一个与Python 2.4 - 2.7兼容的版本。要使用该版本,请安装 rename==1.2

用法

基本语法

rename [-I] [-l] [-q] [-t] [-u] [-v "except_regex"] "regex" "target"
rename -s [-I] [-l] [-q] [-t] [-u] [-v "except_regex"] "substring_from" "substring_to" "regex"
rename --selftest [directory]

选项

regex

匹配要重命名的源文件的正则表达式。示例

"(\w+).caf"
"IMG(\d\d\d\d\).[Jj][Pp][Ee]?[Gg]"
"([0-9]{2})-([0-9]{2})-([12][0-9]{3}).log"

默认情况下,正则表达式是全局的(例如,写入 "[0-9]" 表示 "^[0-9]$")。这是为了避免意外地捕获部分内容。如果您想匹配以特定表达式开头或结尾的所有文件,请将 .* 添加到表达式中,例如 ".*\.mp3" 将匹配所有以 .mp3 结尾的文件。虽然这看起来有点冗余,但它与 "明确比隐式好" 一样。另请参阅:-I

注意:正则表达式是区分大小写的,即使在保留大小写的文件系统中也是如此。如果您想更改这一点,请使用 -I 选项。

target

目标文件名,包含在源匹配中捕获的正则表达式组的引用。组的引用由一个反斜杠字符后跟组号组成。组从1开始编号。组号可以包含在括号中,以区分跟在数字后面的引用。示例

"\1.aiff"
"\(1)1337.zip"
"\3-\1-\2.log"

可以使用特殊的 \(index) 引用引入自动编号。例如

rename "IMG.*\.JPG" "Judy's Birthday \(index).jpg"

默认情况下,索引从1开始,每次增加1,并且用足够的零填充数字,使得每个文件名使用相同数量的数字。这可以通过 --index-first--index-step--index-digits--index-pad-with 选项来更改。

substring_fromsubstring_to

当使用“简单”模式(-s)时,这些参数提供传统的搜索/替换模式

  • substring_from 是一个简单的(原始)子字符串,应该包含在文件名中

  • substring_to 是替换字符串

这两个字符串都是原始的,例如,它们不允许任何通配符、正则表达式等。这大致与现有 rename 工具从 util-linux-ng 软件包的行为兼容。一个明显的区别是文件掩码不使用通配符,而是使用正则表达式。

示例(将下划线转换为空格)

rename -s "_"  " "  ".*\.txt" 

注意: substring_from 是大小写敏感的,即使在大小写保留的文件系统中也是如此。如果您想更改这一点,请使用 -I 选项。substring_to 总是大小写敏感的。

-I--case-insensitive

当使用时,正则表达式以不区分大小写的方式工作,例如,"lib" 的行为类似于 "[Ll][Ii][Bb]"。组引用仍然保留原始的大小写。

-l--lower

当使用时,重命名的文件名将被转换为小写。这不会影响使用的源正则表达式(即它仍然以大小写敏感的方式匹配,除非使用 -I)。另请参阅:-U

-q--quiet

当使用时,不会提供错误输出。应通过返回代码确定调用的状态。

-s--simple

调用“简单”模式。见:substring_fromsubstring_to

-t--test

当使用时,脚本将只模拟重命名,并详细说明它会做什么。如果您不确定表达式可能产生的影响,请使用此功能。

-U--upper

当使用时,重命名的文件名将被转换为大写。这不会影响使用的源正则表达式(即它仍然以大小写敏感的方式匹配,除非使用 -I)。另请参阅:-l

-v "except_regex"--except "except_regex"

当使用时,任何与原始源正则表达式匹配的文件名也将与 except_regex 进行匹配。如果有匹配项,则跳过该文件名。换句话说,匹配 except_regex 的文件名将 不会 被重命名。

正则表达式是 局部 的(例如,编写 "[0-3]" 表示“数字0-3在文件名中的任何位置”)。这是为了使工具在用户忘记在 -v 中添加点-通配符时更加小心,以防止意外重命名过多的文件。如果您只想匹配整个文件名,请使用规范的全局形式(例如,"^filename$")。

为什么 -v?因为 grep -v

另请参阅:-I

–index-first

当使用特殊的 \(index) 引用时,此选项指定第一个索引将是哪个数字。默认:–index-first=1

–index-step

当使用特殊的 \(index) 引用时,此选项指定将添加到第一个值中的数字。指定的数字可以是负数。默认:–index-step=1

–index-digits

当使用特殊 \(index) 引用时,此选项指定每个引用将使用多少位数字。如果一个数字的位数较少,它们将用前导零(或另一个字符,见:--index-pad-with)填充。可以使用特殊值 auto 自动填充足够的数字,以便每个文件名使用相同数量的数字。这有助于确保即使使用愚蠢的算法,文件也能正确排序。默认:--index-digits=auto

--index-pad-with

当使用特殊 \(index) 引用时,此选项指定用于填充的字符。默认:--index-pad-with=0

--selftest

运行所有功能的内部单元测试。在指定的目录中实际重命名生成的文件集。如果没有传递目录,则使用临时目录。每个测试生成自己的文件集。

您可以使用此功能在新的计算机和/或文件系统上测试工具,以确保结果合理。

安全性

  1. 脚本不会允许多个文件重命名为同一个名称。

  2. 脚本不会允许覆盖现有文件。

  3. 上述两个检查在执行任何重命名之前都会对所有匹配项进行检查。

  4. 脚本正确保留了扩展属性和ACL。

其他说明

  1. 脚本支持的正则表达式必须符合Python的 re 模块 处理的语法。

  2. 实际重命名单个文件是通过Python标准库中的 os.rename() 函数完成的。没有确保额外的原子性,例如,如果重命名在中间失败,文件系统将处于部分完成重命名的状态。

  3. 由于不同shell的行为不同,建议的执行方式是将两个参数都放在引号中。

这个项目在Github上可能看起来很新,但实际上它是一个2011年的脚本的重生,已经移至Python 3、Mypy、Hatch、pytest等。一些代码可能反映了我2011年的心态。

可能未来的增强

  1. -p 选项用于为目标创建中间目录。一个问题是保持整个事务的原子性。

  2. -r 选项使源匹配递归。可能很棘手,例如,在哪里重命名?现有的目录结构还是新的?让用户决定?默认是什么?等等。

  3. 交互式模式。需要思考的事情:问题应该在事务开始之前出现,在每一步之前出现,还是两者都要?应该是一个选项吗?

大友好免责声明

本程序是自由软件:您可以在自由软件基金会发布的GNU通用公共许可证(版本3)的条款下重新分配它和/或修改它。

本程序分发的目的是希望它有用,但没有任何保证;甚至没有隐含的保证,即适销性或适用于特定目的。有关详细信息,请参阅GNU通用公共许可证。

不要慌张。该代码已由其作者成功使用,并且包含100%覆盖率的测试。但是,在这些条件下请特别注意

  1. 在文件系统之间重命名。

  2. 在非大小写保留的文件系统下重命名。

  3. 在非常长的路径中重命名。

  4. 重命名易变状态(例如,轮换日志)。

如果丢失任何数据,这是您的责任。祝您愉快!

作者

脚本由 Łukasz Langa 拼接。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

rename-22.12.0.tar.gz (25.7 kB 查看哈希值)

上传时间 源代码

构建分发

rename-22.12.0-py3-none-any.whl (24.4 kB 查看哈希值)

上传时间 Python 3

由以下组织支持