Ordenar e renomear imagens por data em EXIF info

8

Eu tenho uma bagunça na minha pasta de fotos; Eu quero classificá-los de acordo com a data em informações EXIF e renomear de acordo com a data (como 001.jpg, 002.jpg e assim por diante).

Como posso fazer isso no Linux? Eu usei o ImageMagick para algumas tarefas básicas de processamento em massa antes (converter e redimensionar, etc), é possível usá-lo para essa tarefa?

    
por skazhy 31.10.2010 / 12:44

7 respostas

19

No Linux, você pode usar o comando exiftool . Por alguma razão, o manual on-line não contém a seção "RENAMING EXAMPLES", que me deu a dica essencial.

Para arquivos somente JPG, a seguinte chamada de comando deve fazer o trabalho:

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

Explicação:

  • -r é para recursão
  • '-FileName<CreateDate' diz ao exiftool para renomear o arquivo de acordo com sua tag EXIF CreateDate (você pode testar outros como ModifyDate )
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le' informa como construir a cadeia de nomes de ficheiros a partir da origem de datas " CreateDate " (o " %-c " irá anexar um contador em caso de colisões de ficheiros, o " %le " significa "extensão de ficheiro inferior" )
    • Nota : usei " -FileName<... " aqui para renomear os arquivos e movê-los para outra pasta em uma única etapa. O manual aponta que você tem que usar a sintaxe " -Directory<... " para operações de pasta. Isso funcionou para mim desse jeito embora.

Você deve passar algum tempo lendo o manual desta poderosa ferramenta. Talvez haja um caminho ainda mais curto: D

    
por 30.12.2013 / 23:19
5

Experimente este produto gratuito: Classificador AmoK Exif .

    
por 31.10.2010 / 13:10
2

A maneira mais simples é simplesmente importar arquivos para o jbrout ... então (opcionalmente) todos os arquivos podem ter nomes alterados para algo orientado pelo tempo. Ou você pode achar que não precisa mudar os nomes (e o jbrout é suficiente).

    
por 09.10.2012 / 23:52
1

Eu fiz um script python pequeno e pouco otimizado que, na minha opinião, faz o que você pretende:

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
    
por 31.10.2010 / 13:48
1

Para fazê-lo funcionar no Debian Lenny tente isto:

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
    
por 23.01.2011 / 22:46
1

No php eu fiz algo assim:

<?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);
}
    
por 10.05.2011 / 16:29
0

Enquanto estamos nisso, aqui está um estilo mais "gonzo programming", em bash , usando exiftool , ele pode ser solto em vários diretórios e / ou arquivos individuais de uma só vez. Ele ignora arquivos que possuem tipos mime não reconhecidos.

Ele renomeia fotos usando a tag DateTimeOriginal EXIF (portanto, o resultado não é 001.jpg , mas 2015-12-22_14:43:15.jpg .

Se houver um conflito de nomes, os números de índice serão aplicados: 2015-12-22_14:50:57.1.jpg .

Pode ser útil: relabel_photo_with_datetimeoriginal.sh

    
por 05.08.2016 / 14:39