在文件名中解析并重命名日期

时间:2015-07-21 13:16:12

标签: shell command-line scripting

我有一些这样的文件:

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命令来执行此操作?

3 个答案:

答案 0 :(得分:1)

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

 #!/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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我没有要测试的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