在咱們的工做生活中,無論是程序員仍是非程序員,咱們都會遇到過一個需求,那就是對一堆的文件進行重命名。在Windows下有不少優秀的軟件能夠幫助咱們完成這個需求,而在Linux環境下,咱們能夠簡單敲一些代碼就能夠完成這個需求。程序員
本文良許將介紹三種最基本的文件重命名方法,由於比較基本,因此老司機能夠到此爲止。正則表達式
顧名思義,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
假如咱們如今有一堆 .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
假如咱們如今有一堆文件,文件名格式是 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