如何使用awk重命名照片文件,使其命名(因此排序)为;拍摄日期;?

如何使用awk重命名照片文件,使其命名(因此排序)为;拍摄日期;?,awk,metadata,filenames,photo,Awk,Metadata,Filenames,Photo,我有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

我有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\u mm\u dd\u hh\u mm\u ss
字段替换为“拍摄日期和时间”值。保存在每个文件的元数据/属性中

我见过awk用于执行类似操作,但我不太熟悉,不知道如何访问“耗时”元数据等


同样,这也不应该有什么区别:我的电脑是mac电脑。

你可以用
jhead
来实现这一点。命令是:

jhead -n%Y_%m_%d_%H_%M_%S *.jpg
在运行之前,先复制文件!您可以使用
自制
安装
jhead
,方法是:

brew install jhead
或者,如果您没有
自制
,请下载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
您可以将其保存在主目录中,作为
重命名器
,然后进入终端并使脚本如下所示可执行:

chmod +x renamer
然后你需要去你的照片所在的地方,比如说
Desktop\photos

cd "$HOME/Desktop/Photos"
然后运行脚本

$HOME/renamer
应该这样做

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

想想文件
20
,即
20\u 2015\u 02\u 03\u 11:45:52.jpg
。现在想象一下,以100-199开头的文件将列在文件2o之前,文件1000-1999也将列在文件20之前-因为它们的前导
1
s位于文件
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

这个问题需要我们提供更多的帮助。我们喜欢帮助别人,但有时人们需要先帮助自己,比如阅读一本关于语言的书,在线文档,或者询问他们认识的人谁可以帮助他们。一旦你更好地理解了这个主题,我们邀请你编辑这个问题,修正明显的错误,然后重新打开它。StackOverflow不是编码或教程服务。