1

我想整理我的全家照片和电影。我有一个示例代码,但我无法使用 Phil Harvey 的 BASH 代码和 EXIFTOOL 中的 -tr 或 -sed 命令交换文件名中的字符。有人有想法吗?

#!/bin/bash
# scan the files you need

for i in *jpg *mov *jpeg *mpg; *avi *mp4 do

# Get the extension of the file

extension=${i##*.}

# Extract metadata from the file

datetime=$( exiftool -f -s3 -"DateTimeOriginal" "${i}" )

# If the datetime value is empty (returned '-' because of the '-f' option)
# then read another tag

if [ "${datetime}" = '-' ]; then
    datetime=$( exiftool -f -s3 -"MediaCreateDate" "${i}")
fi

# Construct the new filename from the metadata gathered above

newfilename="${datetime}.${extension}"


# Check if the destination filename already exists, and if not,
# create the file

if [ ! -e "${newfilename}" ]; then

 echo mv -v "${i}" "${newfilename}"

else
    echo "${i} would get renamed to ${newfilename} but that file already exists."
fi

done
4

1 回答 1

4

这不需要脚本,Exiftool 可以自己完成。

你的命令看起来像这样:
exiftool -ext jpg -ext mov -ext jpeg -ext mpg -ext avi -ext mp4 -d '[%Y-%m-%d][%A] [%H.%M.%S].%%e' '-Filename<MediaCreateDate' '-Filename<DateTimeOriginal' FileOrDir

( -ext)-extension选项限制要操作的文件扩展名。
( -d)-dateFormat选项和它后面的格式字符串告诉 Exiftool 日期/时间类型标签使用什么格式。更多信息可在Common Date Format Codes下找到。

接下来的两个选项告诉 exiftool 该文件将根据指定的标签(MediaCreateDateDateTimeOriginal)重命名。对同一标签的早期分配,在这种情况下Filename,被后来的分配覆盖,所以DateTimeOriginal如果它存在则将被使用,否则MediaCreateDate。如果两个项目都不存在,则会发生小错误并且不会重命名文件。如果具有该名称的文件已经存在,也会发生同样的事情,但%%c可以将其添加到日期格式字符串中以将增量编号添加到文件名中。

需要注意的一件事是,MediaCreateDate视频文件应该设置为 UTC,并且读取它的程序应该将时间戳调整为本地时间。请参阅Quicktime 标签页上的第四段。但并非所有相机,通常是较旧的相机,都能正确设置,. Exiftool 将按原样返回时间戳,这可能不正确。如果您希望 exiftool 将其调整为本地时间,则可以添加-api QuickTimeUTC选项.

这是我使用的一些示例输出,testname而不是filename.

'X:/!temp/0615090217.jpg' --> 'X:/!temp/[2009-06-15][Monday] [02.17.00].jpg'
'X:/!temp/2013-07-18_12.19.38 - Copy.Jpg' --> 'X:/!temp/[2013-07-18][Thursday] [12.19.38].Jpg'
'X:/!temp/DSC_7689 after.JPG' --> 'X:/!temp/[2006-08-19][Saturday] [09.13.28].JPG'
'X:/!temp/FujiFilmFinePixF200EXR_F0Standard (Provia).jpg' --> 'X:/!temp/[2009-01-25][Sunday] [14.10.46].jpg'
'X:/!temp/FujiFilmFinePixS5Pro.jpg' --> 'X:/!temp/[2006-12-20][Wednesday] [07.20.58].jpg'
'X:/!temp/IMGP0713-XL.jpg' --> 'X:/!temp/[2011-03-10][Thursday] [14.10.54].jpg'
'X:/!temp/IMGP0852.jpg' --> 'X:/!temp/[2003-04-20][Sunday] [16.36.53].jpg'
'X:/!temp/IMG_0938.JPG' --> 'X:/!temp/[2000-01-02][Sunday] [03.04.10].JPG'
'X:/!temp/RCNX0001.JPG' --> 'X:/!temp/[2015-12-20][Sunday] [09.09.05].JPG'
'X:/!temp/Test1.mp4' --> 'X:/!temp/[2015-12-25][Friday] [15.46.15].mp4'
'X:/!temp/Test4.jpg' --> 'X:/!temp/[2010-07-05][Monday] [12.53.36].jpg'
'X:/!temp/Test4.mp4' --> 'X:/!temp/[2014-11-11][Tuesday] [11.11.11].mp4'
'X:/!temp/tif.jpg' --> 'X:/!temp/[2003-03-03][Monday] [03.03.03].jpg'
'X:/!temp/xyzzy.jpg' --> 'X:/!temp/[2012-04-04][Wednesday] [04.04.04].jpg'

这假设在 Linux/Mac 下使用 bash。在 Windows CMD 上,单引号将变为双引号。添加-r( -recurse) 选项以递归到子目录。

于 2016-05-27T23:53:41.820 回答