使用正则表达式匹配来重命名文件。这可以通过单个命令优雅地处理多个重命名。
项目描述
rename
使用正则表达式匹配来重命名文件。这可以通过单个命令优雅地处理多个重命名。
目录
安装
该脚本是一个单独的文件,与任何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_from
、substring_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_from
、substring_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
运行所有功能的内部单元测试。在指定的目录中实际重命名生成的文件集。如果没有传递目录,则使用临时目录。每个测试生成自己的文件集。
您可以使用此功能在新的计算机和/或文件系统上测试工具,以确保结果合理。
安全性
-
脚本不会允许多个文件重命名为同一个名称。
-
脚本不会允许覆盖现有文件。
-
上述两个检查在执行任何重命名之前都会对所有匹配项进行检查。
-
脚本正确保留了扩展属性和ACL。
其他说明
-
脚本支持的正则表达式必须符合Python的
re
模块 处理的语法。 -
实际重命名单个文件是通过Python标准库中的
os.rename()
函数完成的。没有确保额外的原子性,例如,如果重命名在中间失败,文件系统将处于部分完成重命名的状态。 -
由于不同shell的行为不同,建议的执行方式是将两个参数都放在引号中。
这个项目在Github上可能看起来很新,但实际上它是一个2011年的脚本的重生,已经移至Python 3、Mypy、Hatch、pytest等。一些代码可能反映了我2011年的心态。
可能未来的增强
-
-p
选项用于为目标创建中间目录。一个问题是保持整个事务的原子性。 -
-r
选项使源匹配递归。可能很棘手,例如,在哪里重命名?现有的目录结构还是新的?让用户决定?默认是什么?等等。 -
交互式模式。需要思考的事情:问题应该在事务开始之前出现,在每一步之前出现,还是两者都要?应该是一个选项吗?
大友好免责声明
本程序是自由软件:您可以在自由软件基金会发布的GNU通用公共许可证(版本3)的条款下重新分配它和/或修改它。
本程序分发的目的是希望它有用,但没有任何保证;甚至没有隐含的保证,即适销性或适用于特定目的。有关详细信息,请参阅GNU通用公共许可证。
不要慌张。该代码已由其作者成功使用,并且包含100%覆盖率的测试。但是,在这些条件下请特别注意
-
在文件系统之间重命名。
-
在非大小写保留的文件系统下重命名。
-
在非常长的路径中重命名。
-
重命名易变状态(例如,轮换日志)。
如果丢失任何数据,这是您的责任。祝您愉快!
作者
脚本由 Łukasz Langa 拼接。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
rename-22.12.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ebb9f9435c4534b1f9e9f2f0a00a63a0f4d28f1b637eee1abce8a89f1989b71a |
|
MD5 | 5b0a8edaec5c812ccea5eef02fb8e561 |
|
BLAKE2b-256 | f1f1f66583d0e1d2bff585afad155b1c3e9a09cce8d7a650923e4772a1822706 |
rename-22.12.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6d6cccb19732498a4cc2bed828ac81c2aa7694e7225ee54ec065a7c40e9c453a |
|
MD5 | 5d2c6f5d0c980abef4a5c91440f2b480 |
|
BLAKE2b-256 | 0a7106a17dcead559d7a1c3bd01b0ed9810ceff18f4f783a3b7aa538bd22e32c |