你的位置:首页 > 编程开发 > Shell

shell脚本批量修改文件名

2年前 (2017-05-06) 浏览:(635) Shell 评论(0)

工作中还存在这样的需求,批量修改文件名,删除文件名中的某些字符;


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


目录下文件名为如下,要求去掉_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改名


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

spacer.gif


方法四: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

举例如下:批量创建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:

#!/bin/bash
#written by mofansheng@2016-02-17
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
#written by mofansheng@2016-02-17
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'`

尊重共享,欢迎转载,请自觉添加本文链接,谢谢!本文链接:https://www.601849.com/post/178.html