2015-07-21 64 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