【问题标题】:Rename folder name in bash在bash中重命名文件夹名称
【发布时间】:2012-03-25 18:53:57
【问题描述】:

我需要重命名以下文件夹:

d_001_d  
d_001_h  
d_005_d  
d_005_h  
d_007_d  
d_007_h  

在:

d_a_d  
d_a_h  
d_b_d  
d_b_h  
d_c_d  
d_c_h  

所以基本上每个代码都对应一个名称(字母)。我试过了 sed 命令和一个带有数组的 for 循环,但我无法得到我想要的 想要。

感谢帮助

【问题讨论】:

    标签: bash directory rename


    【解决方案1】:
    bos:$ ls
    d_001_d  d_001_h  d_005_d  d_005_h  d_007_d  d_007_h
    bos:$ for x in * ; do mv $x $(echo $x | sed -e 's/001/a/;s/005/b/;s/007/c/') ; done
    bos:$ ls
    d_a_d  d_a_h  d_b_d  d_b_h  d_c_d  d_c_h
    

    【讨论】:

    • 不客气。如果您喜欢这个答案,别忘了点击左侧的复选图标“接受”它。
    【解决方案2】:
    $ ls
    d_001_d  d_001_h  d_005_d  d_005_h  d_007_d  d_007_h
    $ ls | awk -F_ -v OFS=_ 'BEGIN{d["001"]="a"; d["005"]="b"; d["007"]="c"}; {old=$0; $2=d[$2]; printf("mv %s %s\n", old, $0)}' | bash
    $ ls
    d_a_d  d_a_h  d_b_d  d_b_h  d_c_d  d_c_h
    

    【讨论】:

      【解决方案3】:

      如果目录名的长度都一样,你可以这样:

      #!/bin/bash
      
      for DIR in `ls */ -d`
      do
          INDEX=${DIR:2:3}
          case $INDEX in
              001)
                  LETTER="a"
                  ;;
              005)
                  LETTER="b"
                  ;;
              007)
                  LETTER="c"
                  ;;
          esac
          mv "$DIR" ${DIR/$INDEX/$LETTER}
      done
      

      【讨论】:

        【解决方案4】:

        无需硬编码数字->字符映射:

        chr() { [[ ${1} -lt 256 ]] || return 1; printf \\$(printf '%03o' $1); }
        
        printf "%s\n" d_001_d  d_001_h  d_005_d  d_005_h  d_007_d  d_007_h | 
        while read name; do 
          prefix=${name%%_*}
          suffix=${name##*_}
          [[ $name =~ ([0-9]+) ]] && num=$((96+10#${BASH_REMATCH[1]}))
          printf -v new_name "%s_%s_%s" $prefix $(chr $num) $suffix
          echo $new_name 
        done
        

        输出

        d_a_d
        d_a_h
        d_e_d
        d_e_h
        d_g_d
        d_g_h
        

        chr 功能礼貌this answer

        【讨论】:

          【解决方案5】:

          使用 perl 重命名工具,您可以使用正则表达式重命名:

          rename -n 'y/[157]/[abc]/;s/00//' d_00?_?
          
          d_001_d renamed as d_a_d
          d_001_h renamed as d_a_h
          d_005_d renamed as d_b_d
          d_005_h renamed as d_b_h
          d_007_d renamed as d_c_d
          d_007_h renamed as d_c_h
          

          如果使用 -n(不是真的)的测试产生了很好的结果,则省略 -n。

          【讨论】:

            猜你喜欢
            • 2020-08-29
            • 2013-10-06
            • 1970-01-01
            • 2020-10-21
            • 2016-01-25
            • 2014-02-22
            • 2011-12-30
            • 2017-12-12
            • 1970-01-01
            相关资源
            最近更新 更多