教你三招快速檔案批量重新命名方法
阿新 • • 發佈:2020-09-10
在我們的工作生活中,不管是程式設計師還是非程式設計師,我們都會遇到過一個需求,那就是對一堆的檔案進行重新命名。在Windows下有很多優秀的軟體可以幫助我們完成這個需求,而在Linux環境下,我們可以簡單敲一些程式碼就可以完成這個需求。
本文良許將介紹三種最基本的檔案重新命名方法,因為比較基本,所以老司機可以到此為止。
#### 1. rename命令
顧名思義,rename命令就是用來進行重新命名檔名的。rename命令有非常強大的功能,我們可以用它來實現各種各樣複雜的檔名的修改。但是,本文只介紹它最最基本的功能,後期再更新rename其它強大的重新命名功能。rename的最基本的格式如下:
```Shell
rename 源字串 目標字串 檔案
```
其中,源字串表示原檔名需要替換的字串,可以是原檔名的全部或部分;目標字串就是想要替換成的字串;檔案就是需要更改檔名的檔案列表,可以是一個或多個。
現假如目錄下有一堆 `atb_mod_01.cpp,atb_mod_02.cpp,atb_mod_03.cpp,atb_mod_04.cpp` 等形式的檔案,我們的需求是將檔名中的 `mod` 改成 `adb`,那麼完成這個需求的命令如下:
```Shell
[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`。先來看完整的程式碼:
```Shell
#!/bin/bash
for name in `ls *.txt`
do
mv $name ${name%.txt}.cpp
done
```
我們都知道,在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命令來完成這個需求。
我們還是先來看看完整的程式碼。
```Shell
#!/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]+` 表示。注意不要忘記加號,表示前面字元的若干重複。然後,我們用\1、\2分別引用前面的對應部分,再用橫杆連起來,於是就成了這樣:
```Shell
s/([a-z]+)([0-9]+)/\1-\2/
```
因為在不同的Shell裡,括號及加號可能會有不同的含義,所以前面要再加一個轉義符,於是就成了前面所見到的樣子。
再之後,同樣使用mv命令完成重新命名動作。
---
公眾號:良許Linux
### 有收穫?希望老鐵們來個三連擊,給更多的人看到這