/rename

Primary LanguagePython

rename 使用指南


介绍

用途:更改文件名(一般是批量更改,如果你闲的没事的话改一个也行)
特点:轻量易用 功能强大
欢迎提出修改


安装

  1. 安装最新版本的 python3(如果没有的话)
  2. 下载 rename.py
  3. 将 rename.py 的路径添加到系统环境变量

检验是否安装成功

命令行输入(注意前面的$是命令行标志,不需要输入):

$ rename.py -h

如果出现帮助信息,即代表安装成功


使用教程

一. newname 操作(新文件名操作,-n 操作)

在你想要的路径打开命令行

如果你有五个文件:

$ ls
hel.txt  ld.txt  lo.txt  r.txt  wo.txt

想把他们都命名为 helloworld
那么只需要:

$ rename.py -n helloworld

查看一下,发现已经改过来了

$ ls
helloworld0.txt  helloworld2.txt  helloworld4.txt
helloworld1.txt  helloworld3.txt

-n代表新文件名。默认情况下,rename 会选择所有文件,更名为新文件名,并按照输入顺序标好序号,更名过程默认不会修改拓展名

如果说,不想以 0 为开头,可以-c设置起始数字

$ rename.py -n hello -c 1
$ ls
hello1.txt  hello2.txt  hello3.txt  hello4.txt  hello5.txt

注意:已经有同名文件情况下重命名,程序会报错。如果想这么做,可以先批量换成另一个名字,这时同名文件消失,便可重命名,或者使用其他修改操作,而不是新文件名操作

如果说,领导让你做双周的周报,所有文件都是双数,那么也可以,-T可以设置步长(大小写不可以互换)

$ rename.py -n world -c 2 -T 2
$ ls
world10.txt  world2.txt  world4.txt  world6.txt  world8.txt

这时候你说,我是强迫症患者,10 和 2 位数不一样,也好办。我们只要-t指定数字的格式就好,fillzero表示在前面填充 0 补齐数字(没有括号空格等特殊符号时候引号可以省略。也可以是双引号)

$ rename.py -n hello -c 2 -T 2 -t 'fillzero'
$ ls
hello02.txt  hello04.txt  hello06.txt  hello08.txt  hello10.txt

如果你说,我写的是小说,我希望写汉字,-t指定数字格式为chinese即可

$ rename.py -n 红楼梦 -c 2 -T 2 -t chinese
$ ls
红楼梦二.txt  红楼梦八.txt  红楼梦六.txt  红楼梦十.txt  红楼梦四.txt

补充:-t还有英语english,罗马数字roman等格式

你说,不对啊,小说的标题不是这么写的,

小说标题一般在前面。新文件名支持指定序号的位置,用%d 代替序号即可

$ rename.py -n 第%d章红楼梦 -c 2 -T 2 -t chinese
$ ls
第二章红楼梦.txt  第六章红楼梦.txt  第四章红楼梦.txt
第八章红楼梦.txt  第十章红楼梦.txt

然后你说,这么搞不厚道啊。我小说每一章都有自己的名字,到你这里都变成红楼梦了

好,假定你有以下小说:

$ ls
东京八十万禁军教头贾母.txt  林黛玉倒拔垂杨柳.txt  贾宝玉风雪山神庙.txt
刘姥姥初试云雨情.txt        薛宝钗拳打郑关西.txt

想要保留原来的名字,只需要%s 代替原来的名字即可

$ rename.py -n '第%d章 %s' -t chinese -c 1
$ ls
'第一章 东京八十万禁军教头贾母.txt'  '第五章 贾宝玉风雪山神庙.txt'
'第三章 林黛玉倒拔垂杨柳.txt'        '第四章 薛宝钗拳打郑关西.txt'
'第二章 刘姥姥初试云雨情.txt'

可以看到,名字已经完全改好了。但疑问又来了:
正确的顺序是林黛玉倒拔垂杨柳,薛宝钗拳打镇关西,贾宝玉风雪山神庙,东京八十万禁军教头贾母,刘姥姥初尝云雨情
你这么一操作顺序全乱了,还得我人工一个个纠正
其实 rename 提供排序操作,让我们回到这五个小说还没有被改名的时候

$ ls
东京八十万禁军教头贾母.txt  林黛玉倒拔垂杨柳.txt  贾宝玉风雪山神庙.txt
刘姥姥初试云雨情.txt        薛宝钗拳打郑关西.txt

使用-m指定排序类型mtime(最后修改时间)(我们假定你的小说是按顺序写好的)

$ rename.py -n '第%d章 %s' -t chinese -c 1 -m mtime
$ ls
'第一章 林黛玉倒拔垂杨柳.txt'  '第五章 刘姥姥初试云雨情.txt'
'第三章 贾宝玉风雪山神庙.txt'  '第四章 东京八十万禁军教头贾母.txt'
'第二章 薛宝钗拳打郑关西.txt'

可以看到,文件按照正确的顺序命名了

补充:排序类型有很多,可以-h查看帮助了解。可以设置-odesc,将升序变成倒叙

警告:排序数字有上限,数字过大(大概是亿以上)会出错,不过你要是真能塞下上亿的文件在一个文件夹里,也不会需要我这个小脚本了

二. 其他操作

我们上面已经初步了解了 rename。但是你已经发觉了,上面都是对一个文件夹里的所有文件进行操作

假定我有以下文件:

$ ls
东京八十万禁军教头贾母.txt  曹仁.txt  林黛玉倒拔垂杨柳.txt
刘姥姥初试云雨情.txt        曹操.txt  薛宝钗拳打郑关西.txt
曹真.txt                    曹爽.txt  贾宝玉风雪山神庙.txt

我只想给曹家父子加个编号。这时候就要用到 filename 操作了

filename 是第一个参数(通常情况),省略的情况下会对所有文件进行操作

这里我们使用 linux 通配符将所有姓曹的筛选出来,给他们加个数字小尾巴:

$ rename.py 曹* -n %s%d -m mtime
$ ls
东京八十万禁军教头贾母.txt  曹仁1.txt  林黛玉倒拔垂杨柳.txt
刘姥姥初试云雨情.txt        曹操0.txt  薛宝钗拳打郑关西.txt
曹真2.txt                   曹爽3.txt  贾宝玉风雪山神庙.txt

可以看到,只有曹家父子被我们标上了号

关于 linux 通配符其实只有三种主要操作:星号(*)匹配零个或多个任意字符、问号(?)匹配零个或不多于问号个数的任意字符。方括号([和])括起来的字符范围匹配在此范围内的任意字符。其余可自行上网了解

有人会吐槽说,通配符太难了或者太麻烦了,rename 提供更简单的方式,直接输入部分文件名,也可以将文件筛选出来。比如我们将带玉的名字选出来加个情侣后缀

$ rename.py 玉 -n %s【情侣】
$ ls
东京八十万禁军教头贾母.txt  曹操0.txt  林黛玉倒拔垂杨柳【情侣】.txt
刘姥姥初试云雨情.txt        曹爽3.txt  薛宝钗拳打郑关西.txt
曹仁1.txt                   曹真2.txt  贾宝玉风雪山神庙【情侣】.txt

有人说,你这么选择太简单了,我需要更强大的选择方式。那么你可以用正则表达式命令-r(只需要部分匹配即可搜到)

比如,我们将含有叠字的文件名取出来,加个叠字后缀:

$ rename.py -r '(\w)\1+' -n %s【叠字】
$ ls
东京八十万禁军教头贾母.txt    曹操0.txt  林黛玉倒拔垂杨柳【情侣】.txt
刘姥姥初试云雨情【叠字】.txt  曹爽3.txt  薛宝钗拳打郑关西.txt
曹仁1.txt                     曹真2.txt  贾宝玉风雪山神庙【情侣】.txt

现在我们发现,添加后缀的操作很常见,但是-n %s【叠字】这样的操作略微有些冗余,所以我们可以用+s操作添加后缀

$ rename.py +s 后缀哦
$ ls
东京八十万禁军教头贾母后缀哦.txt    曹真2后缀哦.txt
刘姥姥初试云雨情【叠字】后缀哦.txt  林黛玉倒拔垂杨柳【情侣】后缀哦.txt
曹仁1后缀哦.txt                     薛宝钗拳打郑关西后缀哦.txt
曹操0后缀哦.txt                     贾宝玉风雪山神庙【情侣】后缀哦.txt
曹爽3后缀哦.txt

我们可以用+s加后缀,-s减后缀,+p加前缀,-p减前缀 我们发现,老曹家的名字很特别,所以用-p操作减掉所有的前缀

$ rename.py -p 曹
$ ls
东京八十万禁军教头贾母后缀哦.txt    爽3后缀哦.txt
仁1后缀哦.txt                       真2后缀哦.txt
刘姥姥初试云雨情【叠字】后缀哦.txt  薛宝钗拳打郑关西后缀哦.txt
操0后缀哦.txt                       贾宝玉风雪山神庙【情侣】后缀哦.txt
林黛玉倒拔垂杨柳【情侣】后缀哦.txt

可以看到,所有曹前缀都消失了

不对。这么操作只能选择删除某些前缀,我想按照固定数量删除前后缀怎么办

可以用-S切片操作,切片参数最多包含两个参数,(从 0 开始计算)起始位置(包括起始位置),结束位置(不包括结束位置)(若省略则直到末尾)

让我们回到那个比较整洁的版本

$ ls
东京八十万禁军教头贾母.txt  林黛玉倒拔垂杨柳.txt  贾宝玉风雪山神庙.txt
刘姥姥初试云雨情.txt        薛宝钗拳打郑关西.txt
$ rename.py -S 1
$ ls
京八十万禁军教头贾母.txt  宝玉风雪山神庙.txt  黛玉倒拔垂杨柳.txt
姥姥初试云雨情.txt        宝钗拳打郑关西.txt

试着截取 0-5

$ rename.py -S 0 5
$ ls
京八十万禁.txt  姥姥初试云.txt  宝玉风雪山.txt  宝钗拳打郑.txt  黛玉倒拔垂.txt

现在我们又有了新的疑惑,黛玉怎么能倒拔垂杨柳呢?应该是袭人倒把垂杨柳,这时可以用-a替换操作

$ rename.py -a 黛玉 袭人
$ ls
京八十万禁.txt  姥姥初试云.txt  宝玉风雪山.txt  宝钗拳打郑.txt  袭人倒拔垂.txt

当然-a 也是批量操作,只是我们这里恰好只有一个黛玉

补充:-a只是简单替换,-R可使用正则表达式(全部匹配)进行替换

你也可以删掉郑,让宝钗打空气

$ rename.py -d 郑
$ ls
京八十万禁.txt  姥姥初试云.txt  宝玉风雪山.txt  宝钗拳打.txt  袭人倒拔垂.txt

假如你在网上下载了一些英语课程,已经自动编号了

$ ls
lesson0.txt  lesson1.txt  lesson2.txt  lesson3.txt  lesson4.txt

这下没法用到我们的自动编号功能了。想用别的编号类型就麻烦了

没关系,可以使用-N 替换数字功能,第一个参数是正则表达式(全部匹配),第二个参数是要替换的类型

$ rename.py -N '\d' english
$ ls
lessonfour.txt  lessonone.txt  lessonthree.txt  lessontwo.txt  lessonzero.txt

最后,以上操作都是对文件名的操作,如果想更改后缀,可以用-e

$ rename.py -e .md
$ ls
lessonfour.md  lessonone.md  lessonthree.md  lessontwo.md  lessonzero.md

当然你省略掉后缀的'.'也是没问题的

注意:以上所有操作如果有多个操作同时输入,将按照默认顺序一一进行,默认顺序请参照帮助界面。如果同一个操作输入多次,只会按照最后一次输入进行操作。如果用户多个操作之间发生矛盾(比如先删了关键词然后后面替换时候搜索不到),程序会崩溃,这个就请自己担待吧