教你三招快速文件批量重命名方法
在我們的工作生活中,不管是程序員還是非程序員,我們都會(huì)遇到過一個(gè)需求,那就是對(duì)一堆的文件進(jìn)行重命名。在Windows下有很多優(yōu)秀的軟件可以幫助我們完成這個(gè)需求,而在Linux環(huán)境下,我們可以簡(jiǎn)單敲一些代碼就可以完成這個(gè)需求。
本文良許將介紹三種最基本的文件重命名方法,因?yàn)楸容^基本,所以老司機(jī)可以到此為止。
1. rename命令
顧名思義,rename命令就是用來(lái)進(jìn)行重命名文件名的。rename命令有非常強(qiáng)大的功能,我們可以用它來(lái)實(shí)現(xiàn)各種各樣復(fù)雜的文件名的修改。但是,本文只介紹它最最基本的功能,后期再更新rename其它強(qiáng)大的重命名功能。rename的最基本的格式如下:
- rename 源字符串 目標(biāo)字符串 文件
其中,源字符串表示原文件名需要替換的字符串,可以是原文件名的全部或部分;目標(biāo)字符串就是想要替換成的字符串;文件就是需要更改文件名的文件列表,可以是一個(gè)或多個(gè)。
現(xiàn)假如目錄下有一堆 atb_mod_01.cpp,atb_mod_02.cpp,atb_mod_03.cpp,atb_mod_04.cpp 等形式的文件,我們的需求是將文件名中的 mod 改成 adb,那么完成這個(gè)需求的命令如下:
- [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]$ lsatb_adb_01.cpp atb_adb_02.cpp atb_adb_03.cpp atb_adb_04.cpp
2. mv命令配合for循環(huán)方式
假如我們現(xiàn)在有一堆 .txt 文件,我們想將它們的后綴改成 .cpp。先來(lái)看完整的代碼:
- #!/bin/bash
- for name in `ls *.txt`
- do
- mv $name ${name%.txt}.cpp
- done
我們都知道,在Linux里重命名是用 mv 命令,那批量重命名自然會(huì)想到用循環(huán)語(yǔ)句嵌套mv命令。
在這里,我們用 ls *.txt 將當(dāng)前目錄下所有的txt文件全部列出來(lái),然后逐個(gè)放在name變量里去循環(huán)操作。
在循環(huán)體里,我們使用mv命令進(jìn)行重命名。這里我們使用 ${name%.txt} 這種字符串處理方式,表示從name尾部開始刪除與 .txt 匹配的最小部分,并返回剩余部分。之后,再加上 .cpp 后綴。通過這種操作,我們就可以將文件名后綴從.txt改為.cpp。最后我們用mv命令將這個(gè)文件名真正改過來(lái)。
3. sed命令配合for循環(huán)方式
假如我們現(xiàn)在有一堆文件,文件名格式是 test01.txt,test02.txt,test03.txt,test04.txt 也就是前半部分是英文,后半部分是數(shù)字。我們現(xiàn)在想將文件名改成 test-01.txt 這種形式。這次,我們用sed命令來(lái)完成這個(gè)需求。
我們還是先來(lái)看看完整的代碼。
- #!/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 來(lái)獲取所有的 .txt 文件。之后再用echo命令將其順次輸出,作為sed命令的輸入。
接下來(lái),到達(dá)關(guān)鍵部分了。乍一看sed的命令可能有點(diǎn)可怕,但老司機(jī)早已習(xí)以為常了。反引號(hào)里的內(nèi)容其實(shí)是這樣的基本結(jié)構(gòu):
- s/ 原字符串 / 替代的字符串 /
這里我們用到了分組匹配,也就是用括號(hào)按照一定的正則表達(dá)式將原字符串進(jìn)行分組,后面再用 \1,\2,\3…… 來(lái)引用前面的分組,從而在替代的字符串里拼湊成相應(yīng)的格式。
前文已講述,原文件名是由前部分英文及后部分?jǐn)?shù)字所構(gòu)成的,英文可以用 [a-z]+ 表示,數(shù)字可以用 [0-9]+ 表示。注意不要忘記加號(hào),表示前面字符的若干重復(fù)。然后,我們用\1、\2分別引用前面的對(duì)應(yīng)部分,再用橫桿連起來(lái),于是就成了這樣:
- s/([a-z]+)([0-9]+)/\1-\2/
因?yàn)樵诓煌腟hell里,括號(hào)及加號(hào)可能會(huì)有不同的含義,所以前面要再加一個(gè)轉(zhuǎn)義符,于是就成了前面所見到的樣子。
再之后,同樣使用mv命令完成重命名動(dòng)作。
本文授權(quán)轉(zhuǎn)載自公眾號(hào)「良許Linux」。良許,世界500強(qiáng)外企Linux開發(fā)工程師,公眾號(hào)里分享大量Linux干貨,歡迎關(guān)注!