我有一些这样的文件:
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 :(得分: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