如何使用 awk 重命名照片文件,使它们按 "date taken" 命名(并因此排序)?

How to rename photo files using awk, such that they are named (and hence ordered) by "date taken"?

我有 3 组照片,来自 3 个不同的相机(所有相机上都同步了时间)但具有不同的命名方案(例如: IMG_3142.jpgDCM_022.jpg).我想使用以下命名约定重命名每个照片文件:

1_yyyy_mm_dd_hh_mm_ss.jpg for earliest
2_yyyy_mm_dd_hh_mm_ss.jpg for next earliest, and so on, 

直到我们到达最后一个 5000_yyyy_mm_dd_hh_mm_ss.jpg 左右( 最近的)

我希望将 yyyy_mm_dd_hh_mm_ss 字段替换为拍摄这张照片时的“拍摄日期和时间”值。保存在每个文件的metadata/properties中。

我看过awk用于执行类似的操作,但我不够熟悉,不知道如何访问“time taken”元数据等

此外,并不是说这应该有所作为:我的电脑是 mac。

您可以为此使用 jhead。命令为:

jhead -n%Y_%m_%d_%H_%M_%S *.jpg

COPY 您的文件,然后再 运行ning 它!您可以安装 jheadhomebrew 使用:

brew install jhead

或者,如果您没有 homebrew,请下载 here OS X。

这将根据需要在文件名中获取日期。序号有点难。尝试我上面的建议,如果您对此感到满意,我们也许可以处理序列号。基本上,您会再次 运行 jhead 来设置文件的文件修改时间以匹配它们被拍摄的时间 - 然后文件可以按日期顺序显示在列表中,我们可以把你的序列号放在前面。

因此,要使计算机上设置的文件日期与拍摄时间相匹配,请执行以下操作:

jhead -ft *.jpg

现在所有文件都将在您的计算机上注明日期以匹配照片的拍摄时间。然后我们需要在脚本中添加序列号来循环遍历它们:

#!/bin/bash
seq=1

# List files in order, oldest first
for f in $(ls -rt *jpg)
do
   # Work out new name
   new="$seq_$f"
   echo Rename $f as $new
   # Remove "#" from start of following command if things look good so the renaming is actually done
   # mv "$f" $new"
   ((seq++))
done

您可以将其保存在您的 HOME 目录中作为 renamer,然后您将进入终端并使脚本可执行,如下所示:

chmod +x renamer

然后你需要去你的照片所在的地方,说 Desktop\Photos

cd "$HOME/Desktop/Photos"

和运行脚本

$HOME/renamer

应该可以了。

顺便说一句,我想知道在文件名的开头使用一个简单的序列号是多么明智,因为当您在 Finder 中查看它们时,这不会使它们按顺序出现。

考虑文件 20,即 20_2015_02_03_11:45:52.jpg。现在假设以 100-199 开头的文件将在文件 2o 之前列出,文件 1000-1999 也将在文件 20 之前列出 - 因为它们的前导 1 位于文件 20 的前导 2。因此,您可能希望将文件命名为:

0001_...
0002_...
0003_...
...
0019_...
0020_...

然后它们将按顺序出现在 Finder 中。如果需要,请改用此脚本:

#!/bin/bash
seq=1
for f in $(ls -rt *jpg)
do
   # Generate new name with zero-padded sequence number
   new=$(printf "%04d_$f" $seq)
   echo Rename $f as $new
   # Remove "#" from start of following command if things look good so the renaming is actually done
   # mv "$f" $new"
   ((seq++))
done