【问题标题】: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