将带有德语“现在”日期的目录名称转换为 YYYY-MM-DD

将带有德语“现在”日期的目录名称转换为 YYYY-MM-DD

我从 mac 的 iPhoto 导出图片。目录以本地命名中的日期命名(“Day.MONTH YYYY”):

8. Mai 2013/
13. Juli 2013/
31. Oktober 2014/

其中一些带有 GPS 数据:

Capdepera, 2. Juli 2013/
Stuttgart, 13. Februar 2013/
Marsa Alam, 31. Dezember 2011/

我想要像 YYYY-MM-DD<.GPS-Data-if-exists> = 2013-07-02.Capdepera 这样的目录名称

我会将cut -d',' -f1GPS 数据和-f2日期部分(到 $DatePart)分开。第二步,我会用点“。”将日期部分拆分为日和月+年,然后取最后 4 位数字作为年份。之后我会得到

GPS="Capdepera"
DAY=02      # fill leading zero is no issue.
MONTH=Juli
YEAR=2013

现在,为了将月份映射到数字,我将创建一个像这样的数组

Monate="
Januar=01\n
Februar=02\n
Juli=07\n
"

结果echo -e $Monate | grep $MONTH| cut -d'=' -f2我得到了 07 。现在我可以将它们全部连接到最终的目录名称以重命名它。

我现在的问题是:有没有像我上面描述的更简单的方法?我的意思是-f2,在第一步中使用日期部分之后,像 SQL 函数 Convert() 这样的日期转换会给我结果,而无需拆分和数组作为步骤:

转换("$DatePart", +%Y-%m-%d) => 2013-07-02

谢谢,塞拉尔

答案1

使用基于 perl 的rename实用程序,并给出适当的最新版本的 perl(特别是,旧版本Time::Piece不提供use_locale能够解析非英语月份和日期名称的方法):

$ LC_TIME=de_DE.UTF-8 rename -n -- '
    BEGIN{use Time::Piece; Time::Piece->use_locale()};
    s/(.*?), (\d+\. \w+ \d+)/Time::Piece->strptime($2,"%d. %B %Y")->strftime("%Y-%m-%d.$1")/e
  ' *,\ */
rename(Capdepera, 2. Juli 2013/, 2013-07-02.Capdepera/)
rename(Marsa Alam, 31. Dezember 2011/, 2011-12-31.Marsa Alam/)
rename(Stuttgart, 13. Februar 2013/, 2013-02-13.Stuttgart/)

LC_TIME=de_DE.UTF-8如果您的区域设置已使用德语日期时间,则可以省略该分配。更简单的情况(没有 GPS 数据字符串)留作练习。

相关内容