在EXIF信息中按日期对图像进行排序和重命名


9

我的照片文件夹里乱七八糟。我想根据EXIF信息中的日期对它们进行排序,并根据日期进行重命名(例如001.jpg,002.jpg等)。

如何在Linux中执行此操作?我之前将ImageMagick用于一些基本的批量处理任务(转换和调整大小等),是否可以将它用于此任务?

Answers:


21

在Linux上,可以使用命令exiftool。由于某些原因,在线手册中没有包含“重新命名示例”部分,这给了我基本的提示。

对于仅JPG文件,应执行以下命令调用:

exiftool -r '-FileName<CreateDate' -d '%Y-%m-%d/%H_%M_%S%%-c.%%le' <yourFolder>

说明:

  • -r 用于递归
  • '-FileName<CreateDate'告诉exiftool将文件相应地重命名为其EXIF标签CreateDate(不过,您可以尝试其他操作ModifyDate
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'告诉如何从日期源“ CreateDate” 构建文件名字符串(“ %-c”将在文件冲突的情况下附加一个计数器,“ %le”表示“小写的文件扩展名”)
    • 注意:我-FileName<...在这里使用“ ”来重命名文件并将其移动到一个步骤中。该手册指出,您必须使用“ -Directory<...”语法进行文件夹操作。它对我来说是这样的。

您应该花一些时间阅读此功能强大的工具的手册。也许有一个更短的方法:D


1
在文档中的重命名的例子:sno.phy.queensu.ca/~phil/exiftool/...
rwoo


2

最简单的方法是将文件导入到jbrout中……然后(可选)所有文件的名称都可以更改为面向时间的名称。或者,您可能会发现根本不需要更改名称(并且jbrout就足够了)。


1

我做了一个小的但不是非常优化的python脚本,我认为您打算做什么:

1 import pyexiv2, sys, os, time, datetime, random
2 dirname = sys.argv[1]
3 flist=os.listdir(dirname)
4 dic = dict()
5 for fname in flist:
6     metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
7     metadata.read()
8     tag = metadata['Exif.Image.DateTime']
9     timestamp = int(time.mktime(tag.value.timetuple()))
10     #print fname, ' ', tag.value, ' ', timestamp
11     try:
12         dic[timestamp] = fname
13     except:
14         print fname, ' not processed.'
15 
16 keys = dic.keys()
17 keys.sort()
18 i = 0 
19 for k in keys:
20     os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
21     i+=1

您必须安装此库tilloy.net/dev/pyexiv2
celebdor 2010年

1

要使其在Debian Lenny中工作,请尝试以下操作:

import pyexiv2, sys, os, time, datetime, random
dirname = sys.argv[1]
flist=os.listdir(dirname)
dic = dict()
for fname in flist:
    image = pyexiv2.Image(sys.argv[1]+'/'+fname) 
    #metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
    #metadata.read()
    image.readMetadata() 
    tag = image['Exif.Image.DateTime']
    timestamp = int(time.mktime(tag.timetuple()))
    #print fname, ' ', tag.value, ' ', timestamp
    try:
    dic[timestamp] = fname
    except:
    print fname, ' not processed.'

keys = dic.keys()
keys.sort()
i = 0 
for k in keys:
    os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
    i+=1

1

在PHP中,我做了这样的事情:

<?php

$path = "./path/to/images";
$files = scandir($path);

foreach ( $files as $file )
{
    if ( $file[0] === "." )
    {
        continue;
    }
    $ext = end(explode(".", $file));

    $suffix = "image";

    $exif = exif_read_data($path."/".$file, 'EXIF');
    $datetime = str_replace("/","-", $exif['DateTimeDigitized']);

    rename($path."/".$file, $path."/".$datetime.$suffix.".".$ext);
}

0

当我们使用它时,这是一种更“怪异的编程”风格,在中bash,使用exiftool可以一口气放到几个目录和/或单个文件上。它会跳过具有无法识别的mime类型的文件。

它使用DateTimeOriginalEXIF标记重命名照片(因此结果不是,001.jpg而是2015-12-22_14:43:15.jpg

如果存在命名冲突,则会应用索引号:2015-12-22_14:50:57.1.jpg

可能有用:relabel_photo_with_datetimeoriginal.sh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.