• 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_aaa2/g'`
    done
     
    

    解释说明:

    同样使用sed替换,正则表达式,与上面的区别在于第2个括号里面的内容,代表.html 分隔符和后缀名为一体,替换内容的话不需要再单独加.点;.分隔符同样需要使用进行脱意;

    可以使用sed -r参数,看起来就清爽很多,不需要脱意;

    mv $file `echo $file|sed -r 's/(.*)(..*)/1_aaa2/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

  • 相关阅读:
    Nginx——基本操作
    JavaWeb——关于RequestDispatcher的原理
    JavaWeb——XML转义符字
    JavaWeb——JSTL 核心标签库使用
    JavaWeb——jsp-config
    URL和URI区别
    Docker入门5------生产力工具docker-compose
    Docker入门4------Dockerfile
    Docker入门3------手动编辑自定义镜像
    Docker入门2------容器container常规操作
  • 原文地址:https://www.cnblogs.com/shuiche/p/12030129.html
Copyright © 2020-2023  润新知