如何使用awk重命名照片文件,使其命名(因此排序)为;拍摄日期;?
我有3组照片,来自3个不同的摄像头(所有摄像头上的时间同步),但命名方案不同(例如:如何使用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
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不是编码或教程服务。