shell腳本:批量修改文件名(添加/刪除文件名中字符)


添加字符

舉例如下:批量創建10個隨機字符串的文件,要求每個文件名后面添加_aaa,后綴名不變;

[root@localhost goodboy]# ls

adddbbdedf.html  baacjaiija.html  bhcfaabcfh.html  dgjdcdfbca.html  efejadfdji.html

agdhcdeaje.html  bgffbffjcg.html  cbbiebdafh.html  diadebbhag.html  jcajafgejf.html

腳本1:

[root@localhost ~]# cat 02.sh
#!/bin/bash
path=/goodboy
[ -d $path ] && cd $path
for file in `ls`
do
 mv $file `echo $file|sed 's/\(.*\)\.\(.*\)/\1_aaa.\2/g'`
done

解釋說明:

使用sed替換,正則表達式第1個()括號里面代表文件名即\1;中間. 使用\進行脫意,代表分隔符;

第2個括號里面代表后綴html內容即\2;

使用此方法需要在替換中添加.符號;

 

更改后的效果如下:

[root@localhost goodboy]# ll
-rw-r--r-- 1 root root 0 2月  17 17:40 adddbbdedf_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 agdhcdeaje_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 baacjaiija_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 bgffbffjcg_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 bhcfaabcfh_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 cbbiebdafh_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 dgjdcdfbca_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 diadebbhag_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 efejadfdji_aaa.html
-rw-r--r-- 1 root root 0 2月  17 17:40 jcajafgejf_aaa.html

  

腳本2:

#!/bin/bash
path=/goodboy
[ -d $path ] && cd $path
for file in `ls`
do
 mv $file `echo $file|sed 's/\(.*\)\(\..*\)/\1_aaa\2/g'`
done
 

 

解釋說明:

同樣使用sed替換,正則表達式,與上面的區別在於第2個括號里面的內容,代表.html 分隔符和后綴名為一體,替換內容的話不需要再單獨加.點;.分隔符同樣需要使用\進行脫意;

 

可以使用sed -r參數,看起來就清爽很多,不需要\脫意;

mv $file `echo $file|sed -r 's/(.*)(\..*)/\1_aaa\2/g'`

 

刪除字符

舉例如下:批量改名,刪除文件名中多余字符

目錄下文件名為如下,要求去掉_finished。

stu_102999_1_finished.jpg

stu_102999_2_finished.jpg

stu_102999_3_finished.jpg

stu_102999_4_finished.jpg

stu_102999_5_finished.jpg

 

可以實現的方法有很多種:

方法一:for循環結合sed替換

[baby@localhost ~]$ for file in `ls *.jpg`;do mv $file `echo $file|sed 's/_finished//g'`;done;

  

方法二:ls結合awk,輸出交給bash執行

[baby@localhost ~]$ ls *.jpg |awk -F "_finished" '{print "mv "$0" "$1$2""}'|bash

   

實際執行的命令如下,以_finished作為分隔符,mv及變量 需要加雙引號

[baby@localhost ~]$ ls *.jpg |awk -F "_finished" '{print "mv "$0" "$1$2""}'
mv stu_102999_1_finished.jpg stu_102999_1.jpg
mv stu_102999_2_finished.jpg stu_102999_2.jpg
mv stu_102999_3_finished.jpg stu_102999_3.jpg
mv stu_102999_4_finished.jpg stu_102999_4.jpg
mv stu_102999_5_finished.jpg stu_102999_5.jpg

  

方法三:rename改名(rename 需要安裝)

[baby@localhost ~]$ rename "_finished" "" *.jpg

 

方法四:for循環加變量部分截取

[baby@localhost ~]$ for file in `ls *.jpg`;do mv $file `echo ${file%_finished*}.jpg`;done;

  

不使用echo也可以實現

[baby@localhost ~]$ for file in `ls *.jpg`;do mv $file ${file%_finished*}.jpg;done;

  

更改后結果如下:

stu_102999_1.jpg
stu_102999_2.jpg
stu_102999_3.jpg
stu_102999_4.jpg
stu_102999_5.jpg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM