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

在咱们的工做生活中,无论是程序员仍是非程序员,咱们都会遇到过一个需求,那就是对一堆的文件进行重命名。在Windows下有不少优秀的软件能够帮助咱们完成这个需求,而在Linux环境下,咱们能够简单敲一些代码就能够完成这个需求。程序员

本文良许将介绍三种最基本的文件重命名方法,由于比较基本,因此老司机能够到此为止。正则表达式

1. rename命令

顾名思义,rename命令就是用来进行重命名文件名的。rename命令有很是强大的功能,咱们能够用它来实现各类各样复杂的文件名的修改。可是,本文只介绍它最最基本的功能,后期再更新rename其它强大的重命名功能。rename的最基本的格式以下:centos

rename 源字符串 目标字符串 文件

其中,源字符串表示原文件名须要替换的字符串,能够是原文件名的所有或部分;目标字符串就是想要替换成的字符串;文件就是须要更改文件名的文件列表,能够是一个或多个。bash

现假如目录下有一堆 atb_mod_01.cpp,atb_mod_02.cpp,atb_mod_03.cpp,atb_mod_04.cpp 等形式的文件,咱们的需求是将文件名中的 mod 改为 adb,那么完成这个需求的命令以下:code

[alvin@VM_0_16_centos exp3]$ ls
atb_mod_01.cpp  atb_mod_02.cpp  atb_mod_03.cpp  atb_mod_04.cpp
[alvin@VM_0_16_centos exp3]$ rename mod adb *
[alvin@VM_0_16_centos exp3]$ ls
atb_adb_01.cpp  atb_adb_02.cpp  atb_adb_03.cpp  atb_adb_04.cpp

2. mv命令配合for循环方式

假如咱们如今有一堆 .txt 文件,咱们想将它们的后缀改为 .cpp。先来看完整的代码:字符串

#!/bin/bash

for name in `ls *.txt`
do
    mv $name ${name%.txt}.cpp
done

咱们都知道,在Linux里重命名是用 mv 命令,那批量重命名天然会想到用循环语句嵌套mv命令。字符串处理

在这里,咱们用 ls *.txt 将当前目录下全部的txt文件所有列出来,而后逐个放在name变量里去循环操做。for循环

在循环体里,咱们使用mv命令进行重命名。这里咱们使用 ${name%.txt} 这种字符串处理方式,表示从name尾部开始删除与 .txt 匹配的最小部分,并返回剩余部分。以后,再加上 .cpp 后缀。经过这种操做,咱们就能够将文件名后缀从.txt改成.cpp。最后咱们用mv命令将这个文件名真正改过来。class

3. sed命令配合for循环方式

假如咱们如今有一堆文件,文件名格式是 test01.txt,test02.txt,test03.txt,test04.txt 也就是前半部分是英文,后半部分是数字。咱们如今想将文件名改为 test-01.txt 这种形式。此次,咱们用sed命令来完成这个需求。test

咱们仍是先来看看完整的代码。

#!/bin/bash

for file in `ls *.txt`
do
     newFile=`echo $file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`
     mv $file $newFile
done

前面同样用 ls \*.txt 来获取全部的 .txt 文件。以后再用echo命令将其顺次输出,做为sed命令的输入。

接下来,到达关键部分了。乍一看sed的命令可能有点可怕,但老司机早已习觉得常了。反引号里的内容实际上是这样的基本结构:

s/ 原字符串 / 替代的字符串 /

这里咱们用到了分组匹配,也就是用括号按照必定的正则表达式将原字符串进行分组,后面再用 \1,\2,\3…… 来引用前面的分组,从而在替代的字符串里拼凑成相应的格式。

前文已讲述,原文件名是由前部分英文及后部分数字所构成的,英文能够用 [a-z]+ 表示,数字能够用 [0-9]+ 表示。注意不要忘记加号,表示前面字符的若干重复。而后,咱们用\一、\2分别引用前面的对应部分,再用横杆连起来,因而就成了这样:

s/([a-z]+)([0-9]+)/\1-\2/

由于在不一样的Shell里,括号及加号可能会有不一样的含义,因此前面要再加一个转义符,因而就成了前面所见到的样子。

再以后,一样使用mv命令完成重命名动做。


公众号:良许Linux

有收获?但愿老铁们来个三连击,给更多的人看到这篇文章

相关文章
相关标签/搜索