当前位置: 首页 > 科技观察

教你三种快速批量重命名文件的方法

时间:2023-03-16 23:38:02 科技观察

在我们的工作和生活中,不管我们是程序员还是非程序员,都会遇到一个需求,那就是对一堆文件进行重命名。Windows下有很多优秀的软件可以帮助我们完成这个需求,而在Linux环境下,我们只要敲一些代码就可以完成这个需求。本文将介绍三种最基本的文件重命名方法,因为比较基础,所以老司机可以到此为止。1、rename命令顾名思义,rename命令就是用来重命名文件名的。rename命令有一个非常强大的功能,我们可以用它来修改各种复杂的文件名。不过本文只介绍其最基本的功能,rename其他强大的重命名功能会在后续更新。rename最基本的格式如下:renamesourcestringtargetstringfile其中,sourcestring表示要替换为原文件名的字符串,可以是原文件名的全部或部分;targetstring为要替??换的字符串;File为需要更改文件名的文件列表,可以是一个也可以是多个。现在如果目录下有一堆atb_mod_01.cpp、atb_mod_02.cpp、atb_mod_03.cpp、atb_mod_04.cpp等形式的文件,我们的需求是将文件名中的mod改为adb,那么commandtocompletethisrequirementisasfollows:[alvin@VM_0_16_centosexp3]$lsatb_mod_01.cppatb_mod_02.cppatb_mod_03.cppatb_mod_04.cpp[alvin@VM_0_16_centosexp3]$renamemodadb*[alvin@VM_0_16_centosexp3]$lsatb_adb_01.cppatb_adb_02.cppatb_adb_03.cppatb_adb_04.cpp2.mv指令配给循环方式假,因为我们现在有一堆.txt文件,我们想把它们的后缀改成.cpp。先看完整代码:#!/bin/bashfornamein`ls*.txt`domv$name${name%.txt}.cppdone大家都知道linux中重命名用的是mv命令,那么批量重命名自然是你会的考虑使用循环语句嵌套mv命令。这里,我们使用ls*.txt列出当前目录下所有的txt文件,然后将它们一一放入name变量中进行循环运行。在循环体中,我们使用mv命令重命名。这里我们使用${name%.txt}的字符串处理方式,即从name末尾删除匹配.txt的最小部分,将剩余的部分返回。之后,添加.cpp后缀。通过这个操作,我们可以将文件名后缀由.txt改为.cpp。最后,我们使用mv命令来实际更改文件名。3、sed命令配合for循环方式。如果我们现在有一堆文件,文件名的格式是test01.txt、test02.txt、test03.txt、test04.txt,也就是前半部分是英文,后半部分是数字。我们现在要将文件名更改为类似test-01.txt的名称。这一次,我们使用sed命令来完成这个需求。我们先来看看完整的代码。#!/bin/bashforfilein`ls*.txt`donewFile=`echo$file|sed's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`Mv$file$newFiledone像以前一样使用ls\*.txt获取所有.txt文件。然后用echo命令依次输出,作为sed命令的输入。接下来,到了关键部分。乍一看,sed的命令可能有点吓人,但老司机早就习惯了。反引号中的内容其实就是这样一个基本结构:s/原始字符串/替换字符串/这里我们使用分组匹配,即用括号将原始字符串按照一定的正则表达式进行分组,后面使用\1,\2,\3...引用之前的分组,从而拼凑出替换字符串中对应的格式。如前所述,原始文件名由前半部分英文和后半部分数字组成。英文可以用[a-z]+表示,数字可以用[0-9]+表示。注意不要忘记加号,这意味着前一个字符的多次重复。然后,我们用\1和\2来引用前面对应的部分,再用横杆连接起来,就变成了这样:s/([a-z]+)([0-9]+)/\1-\2/因为在不同的shell中,括号和加号可能有不同的含义,所以前面必须加一个转义符,所以就变成了之前看到的样子。之后,同样使用mv命令完成重命名动作。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!