Ordenar e renomear imagens por data em EXIF ​​info

9

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 esta tarefa?

skazhy
fonte

Respostas:

20

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 tentar outros como ModifyDatese)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'informa como construir a cadeia de nome de arquivo a partir da fonte de data " CreateDate" (o " %-c" adicionará um contador em caso de colisões de arquivos, o " %le" significa "extensão de arquivo com menor cobertura")
    • Nota : Eu 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 -Directory<...sintaxe " " para operações de pasta. Isso funcionou para mim desse jeito embora.

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

user285690
fonte
1
Os exemplos de renomeação na documentação: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo
5

Tente este produto grátis: AmoK Exif Sorter .

harrymc
fonte
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 alterar os nomes (e o jbrout é suficiente).

mcepl
fonte
1

Eu fiz um script Python pequeno e não muito 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
celebdor
fonte
Você tem que instalar esta biblioteca tilloy.net/dev/pyexiv2
celebdor
1

Para fazer isso 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
Patrik Wallander
fonte
1

Em 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);
}
frankmannen
fonte
0

Enquanto estamos nisso, aqui é um estilo que é mais "gonzo programação", em bash, usando exiftool, 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 DateTimeOriginaltag EXIF ​​(então o resultado não é 001.jpgmais do que 2015-12-22_14:43:15.jpg.

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

Pode ser útil: relabel_photo_with_datetimeoriginal.sh

David Tonhofer
fonte