2015-07-21 35 views
0

我有一些文件是这样的:解析和重命名日期在文件名

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命令来做到这一点?

回答

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 
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 
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