0

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

大多数难题都在工作,我什至有工作正则表达式,我只是不知道如何使用 bash 或其他工具的某种组合来应用它。我一直在看到 sed 建议,但我不知道如何应用它。

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

  • 表达:/(\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 替换为从文件名中提取的日期。我觉得我很接近,它只是连接最后的点。

4

2 回答 2

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 的“参数扩展”来拆分文件名来实现这一点,但这需要更多的输入。

于 2016-01-04T18:05:54.997 回答
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
于 2016-01-05T03:16:15.570 回答