[Linux] 使用 bash 的變數字串替換功能做批次改名

[Linux] 使用 bash 的變數字串替換功能做批次改名

之前有許多的 sprint 計劃表是用第幾個 sprint + 時間區間來命名的,例如:

RD_1.0_Sprint26_20140721_0801.xlsx
RD_1.0_Sprint27_20140804_0815.xlsx
RD_1.0_Sprint28_20140818_0829.xlsx
RD_2.0_Sprint38_20150105_0116.xlsx
RD_2.0_Sprint39_20150119_0130.xlsx
RD_2.0_Sprint40_20150202_0217.xlsx

 

不過,sprint 雖然是一直往下累計,但版本號卻有可能同時要處理 1.0 和 2.0 的工作,

之後還可能會有其他的版本號要處理,因此這樣的命名似乎有點怪異…

想把它的版本號直接拿掉的話,要怎麼做呢?

當然可以找批次改名軟體來做,不過在 Mac/Linux 上的話,

用 bash 的 variable substitution 功能就行了~

 

參考一下 Advanced Bash-Scripting Guide: Manipulating Variables 這篇文章,

可以知道要取代掉變數的某個字串,用 ${var/pattern/newstr} 的格式就行了,

像在本例中,用 ${var/_[12].0/} 就能把 _1.0 和 _2.0 字串拿掉~

先不用 mv,用 echo 指令確認看看效果:

testuser@localhost $ for f in *.xlsx; do echo ${f/_[12].0/}; done
RD_Sprint26_20140721_0801.xlsx
RD_Sprint27_20140804_0815.xlsx
RD_Sprint28_20140818_0829.xlsx
RD_Sprint38_20150105_0116.xlsx
RD_Sprint39_20150119_0130.xlsx
RD_Sprint40_20150202_0217.xlsx

 

效果看來不錯,將 echo 改成 mv 來改名吧:

for f in *.xlsx; do mv $f ${f/_[12].0/}; done

 

確實改名都成功囉,快速又方便~~^^/

testuser@localhost $ ll
-rw-r--r--@ 1 testuser  staff   13466  7 30  2014 RD_Sprint26_20140721_0801.xlsx
-rw-r--r--@ 1 testuser  staff   12666  8  1  2014 RD_Sprint27_20140804_0815.xlsx
-rw-r--r--@ 1 testuser  staff   12582  8 15  2014 RD_Sprint28_20140818_0829.xlsx
-rw-r--r--@ 1 testuser  staff   17044  1 16 00:42 RD_Sprint38_20150105_0116.xlsx
-rw-r--r--@ 1 testuser  staff   17990  1 27 16:55 RD_Sprint39_20150119_0130.xlsx
-rw-r--r--@ 1 testuser  staff   18946  2 24 10:32 RD_Sprint40_20150202_0217.xlsx

 

 

 

(本頁面已被瀏覽過 115 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料