如何使用 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.jpg
、DCM_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 它!您可以安装 jhead
和 homebrew
使用:
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
我有 3 组照片,来自 3 个不同的相机(所有相机上都同步了时间)但具有不同的命名方案(例如: IMG_3142.jpg
、DCM_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 它!您可以安装 jhead
和 homebrew
使用:
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