美文网首页
『Shell Script 练习』批量替换文件名中的字符

『Shell Script 练习』批量替换文件名中的字符

作者: ShawnMagic | 来源:发表于2020-08-04 18:16 被阅读0次

    为啥搞这个

    我的项目比较复杂,又好多个材料,时期,组学的数据,公司回来的结果五花八门,特别是result里面的文件名字更是又臭又长。之前老写类似:

    for i in `ls *xxx*; do mv $i `echo $i | gsed 's/aaa/bbb/g'`;done
    

    单行确实很方便。
    不过前几天玩了玩R的getopt现在又想练习下shell的getopts,就把这个替换文件名字符写成了个小脚本。当然现在还很傻瓜,以后估计会完善... 练练手吧,可能是把简单问题复杂化了...

    脚本

    #! /bin/bash
    set -e ## 报错打断,防止一直错下去
    ## 帮助内容
    func(){
        echo "Usage:"
        echo "changName.sh [-c conf] [-s string] [-r replace] [-b backup] "
        echo "Description"
        echo "[-c]:conf,    The file name list in one config file, one file per line"
        echo "[-s]:string,  The string in your file name you want to remove"
        echo "[-r]:replace,     The string in your file name you want to add"
        echo "[-b]:backup,  Do you want backup for you original files?"
        exit -1
    }
    ## 是否备份原始文件,如果不写-b默认不备份
    backup="no"
    ## 设置各个参数
    while getopts 'h:c:s:r:b' OPT;
    do
        case $OPT in
            c) conf="$OPTARG";;
            s) string=`echo "$OPTARG"`;;
            b) backup="yes";;
            r) replace=`echo "$OPTARG"`;;
            h) func;;
            ?) func;;
        esac
    done
    ## 提示你的参数设置
    echo "Your setting:"
    echo "The strings you want remove:" ${string}
    echo "The strings you want to replace the removed strings:" ${replace}
    echo "The original file was retained:" ${backup}
    while read id
    do
        file=$(basename $id) 
        old=`echo $file` ## 这里要提取的是字符,echo你上面文件名赋值的结果就是stirng
        new=`echo $old | gsed "s/$string/${replace}/g"` ## 你改后的文件名 linux的话把gsed改成sed,如果sed中有变量的话需要双引号
        echo "The old filename" "##"$old"##" "has been replaced as" "##"$new"##"
        ## 执行
        if [[ $backup == "yes" ]]; then
            #do not backup
            cp ${file} ${new}; else
            #backup
            mv ${file} ${new}
        fi
    done<$conf
    

    嗯 本来一行的事写了这来长ಥ_ಥ....不过这里多了个是否备份的选项...毕竟我之前干过一下把文件搞丢了的情况.... bash下一顿操作很可能让你的文件找不到了...所以新手还是加上-b吧。

    ## 写个快捷方式
    echo "alias cname='sh ~/08.MyScript/shell/changeName.sh'" >> ~/.bash_alias
    source ~/.bash_alias
    ## 看下帮助
    cname -h 
    /Users/sirus/08.MyScript/shell/changeName.sh: option requires an argument -- h
    Usage:
    changName.sh [-c conf] [-s string] [-r replace] [-b backup] 
    Description
    [-c]:conf,  The file name list in one config file, one file per line
    [-s]:string,    The string in your file name you want to remove
    [-r]:replace,   The string in your file name you want to add
    [-b]:backup,    Do you want backup for you original files?
    ## 结构
    tree 
    .
    ├── adf.xxx.xls
    ├── ba.xxx.xls
    ├── qwed.xxx.xls
    ├── wed.xxx.xls
    └── wesd.xxx.xls
    

    实际操作

    ## 将xxx换成yyy并且保留原始文件
    ls *xxx* >config ## 做一个配置文件
    cname -c config -s 'xxx' -r 'yyy' -b
    Your setting:
    The strings you want remove: xxx
    The strings you want to replace the removed strings: yyy
    The original file was retained: yes
    The old filename ##adf.xxx.xls## has been replaced as ##adf.yyy.xls##
    The old filename ##ba.xxx.xls## has been replaced as ##ba.yyy.xls##
    The old filename ##qwed.xxx.xls## has been replaced as ##qwed.yyy.xls##
    The old filename ##wed.xxx.xls## has been replaced as ##wed.yyy.xls##
    The old filename ##wesd.xxx.xls## has been replaced as ##wesd.yyy.xls##
    

    看下结果

    tree
    .
    ├── adf.xxx.xls
    ├── adf.yyy.xls
    ├── ba.xxx.xls
    ├── ba.yyy.xls
    ├── config
    ├── qwed.xxx.xls
    ├── qwed.yyy.xls
    ├── wed.xxx.xls
    ├── wed.yyy.xls
    ├── wesd.xxx.xls
    └── wesd.yyy.xls
    ## 将xxx删掉,而且不保留原始文件
    cname -c config -s 'xxx' -r '' -b
    tree
    Your setting:
    The strings you want remove: xxx
    The strings you want to replace the removed strings:
    The original file was retained: no
    The old filename ##adf.xxx.xls## has been replaced as ##adf..xls##
    The old filename ##ba.xxx.xls## has been replaced as ##ba..xls##
    The old filename ##qwed.xxx.xls## has been replaced as ##qwed..xls##
    The old filename ##wed.xxx.xls## has been replaced as ##wed..xls##
    The old filename ##wesd.xxx.xls## has been replaced as ##wesd..xls##
    

    当然是支持正则表达式的。就不举例子了。可以自己玩一下

    相关文章

      网友评论

          本文标题:『Shell Script 练习』批量替换文件名中的字符

          本文链接:https://www.haomeiwen.com/subject/gbwwrktx.html