[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
(本頁面已被瀏覽過 186 次)