【问题标题】:Parse and rename date in filename解析和重命名文件名中的日期
【发布时间】:2015-10-10 23:18:06
【问题描述】:

我有一些这样的文件:

XXXXXXXX-15Jan2014.pdf
XXXXXXXX-15Jan2015.pdf
XXXXXXXX-22Aug2013.pdf

我想将它们重命名为

XXXXXXXX-2014-01-15.pdf
XXXXXXXX-2015-01-15.pdf
XXXXXXXX-2013-08-22.pdf

即把<day><month><year>重命名为<year>-<month-as-number>-<day>

有没有一个超级简单的 linux/osx 命令可以做到这一点?

【问题讨论】:

    标签: shell command-line scripting


    【解决方案1】:

    我没有要测试的 OSX 机器,但这应该可以:

    while read filename; do 
        prefix=${filename%-*}
        ext=${filename##*.}
        date=${filename##*-}; date=${date%.*}
        echo mv "$filename" "$prefix-$(date -jf "%d%b%Y" "$date" "+%Y-%m-%d").$ext"
    done <<END
    XXXXXXXX-15Jan2014.pdf
    XXXXXXXX-15Jan2015.pdf
    XXXXXXXX-22Aug2013.pdf
    END
    

    【讨论】:

      【解决方案2】:

      我不能说任何命令。 试试这个脚本。

       #!/bin/bash
      
      for file in `ls`
      do
              FirstPart=`echo $file|rev|cut -d"-" -f2|rev`
              MON=`echo $file|rev|cut -d"." -f2|rev`
              date=`echo $file|rev|cut -d"-" -f1|rev`
              read date year <<<${date//[^0-9]/ }
              echo "$MON" | grep -i "jan" && mon=1
              echo "$MON" | grep -i "feb" && mon=2
              echo "$MON" | grep -i "mar" && mon=3
              echo "$MON" | grep -i "apr" && mon=4
              echo "$MON" | grep -i "may" && mon=5
              echo "$MON" | grep -i "jun" && mon=6
              echo "$MON" | grep -i "jul" && mon=7
              echo "$MON" | grep -i "aug" && mon=8
              echo "$MON" | grep -i "sep" && mon=9
              echo "$MON" | grep -i "oct" && mon=10
              echo "$MON" | grep -i "nov" && mon=11
              echo "$MON" | grep -i "dec" && mon=12
              newName="$FirstPart-$year-$mon-$date"
              mv $file $newName
      done
      

      【讨论】:

        【解决方案3】:

        awk 可以提供帮助:

        awk -F'[-.]' '{c="date -d" $2 " +%F"; c|getline d;close(c);printf "mv %s %s-%s.pdf\n",$0,$1, d}'
        

        上述单行代码将生成mv 命令行来进行重命名。你可以尝试的是:

        ls -1 *.pdf|awk -F'[-.]' '{c="date -d" $2 " +%F"; c|getline d;close(c);printf "mv %s %s-%s.pdf\n",$0,$1, d}'
        

        您将看到mv ... 命令作为输出,要执行这些语句以实现您的重命名目标,只需将命令传送到|sh,即:

        ls ..|awk..|sh
        

        我选择了您的一个文件作为示例:

        kent$  ls -1 *.pdf
        XXXXXXXX-15Jan2014.pdf
        
        kent$  ls -1 *.pdf|awk -F'[-.]' '{c="date -d" $2 " +%F"; c|getline d;close(c);printf "mv %s %s-%s.pdf\n",$0,$1, d}'|sh
        
        kent$  ls -1 *.pdf                                                                                                    
        XXXXXXXX-2014-01-15.pdf
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-06
          • 2021-07-01
          • 1970-01-01
          • 2020-08-05
          • 2022-01-19
          相关资源
          最近更新 更多