这个正则表达式使用什么工具

时间:2016-01-04 17:55:27

标签: regex bash automator exiftool

我正在使用Automator,Bash和Exiftool的组合来获取这样的文件名:0615090217.jpg并将创建的日期更改为2009:06:15 02:17:00

大部分拼图都在工作,我甚至有正则表达式工作,我只是不知道如何使用bash或其他工具的组合来应用它。我一直看到sed建议,但我不知道如何应用它。

以下正则表达式有效here,但我不知道如何在我的设置中应用它:

  • 表达式:/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)\.[^.]+$/g

  • 替换:\n20$3:$1:$2 $4:$5:00\n\t

  • 文字:0615090217.jpg

我的Automator工作流程中的shell脚本如下所示:

for f in "$@"
do
  FILENAME=$(basename "$f")
  MYDATE='2010:07:09 12:22:00'
  /usr/local/bin/exiftool -overwrite_original_in_place -preserve "-AllDates=${MYDATE}" "$f"
done

我想使用我的正则表达式或其他方法将MYDATE替换为从文件名中提取的日期。我觉得我很接近,它只是连接最后的点。

2 个答案:

答案 0 :(得分:2)

如果你正在使用OSX,FreeBSD,NetBSD等,那么date命令可以让你轻松地从一种格式转换为另一种格式:

#!/usr/bin/env bash

for f in "$@"
do
  FILENAME=$(basename "$f")
  MYDATE=$(date -j -f '%m%d%y%H%M.jpg' "$FILENAME" '+%Y-%m-%d %H:%M:00')
  /usr/local/bin/exiftool \
    -overwrite_original_in_place \
    -preserve "-AllDates=${MYDATE}" \
    "$f"
done

你也可以通过使用bash的“参数扩展”来翻译文件名来实现这一点,但这需要更多的输入。

答案 1 :(得分:2)

Exiftool可以自己做到这一点。不需要脚本,因为这会降低整个过程的速度,因为它会为每个文件调用exiftool。

尝试类似:
/usr/local/bin/exiftool -overwrite_original_in_place -preserve '-AllDates<${Filename;s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)\.[^.]+$/20$3:$1:$2 $4:$5:00/}' DIR

我刚拿起你的正则表达式并把它卡进去,所以先测试一下,当然。我在这里的快速测试工作正常,输出如下。

c:\>exiftool -g1 -alldates X:\!temp\0615090217.jpg
---- IFD0 ----
Modify Date                     : 2012:08:30 22:25:33
---- ExifIFD ----
Date/Time Original              : 2013:18:08 19:04:15
Create Date                     : 2012:08:30 22:25:33

c:\>exiftool "-AllDates<${Filename;s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)\.[^.]+$/20$3:$1:$2 $4:$5:00/}" X:\!temp\0615090217.jpg
1 image files updated

c:\>exiftool -g1 -alldates X:\!temp\0615090217.jpg
---- IFD0 ----
Modify Date                     : 2009:06:15 02:17:00
---- ExifIFD ----
Date/Time Original              : 2009:06:15 02:17:00
Create Date                     : 2009:06:15 02:17:00