Ordina e rinomina le immagini per data nelle informazioni EXIF


9

Ho un casino nella mia cartella foto; Voglio ordinarli in base alla data nelle informazioni EXIF ​​e rinominarli in base alla data (come 001.jpg, 002.jpg e così via).

Come posso farlo in Linux? Ho già utilizzato ImageMagick per alcune attività di elaborazione di massa di base (conversione e ridimensionamento, ecc.), È possibile utilizzarlo per questa attività?

Risposte:


21

Su Linux puoi usare il comando exiftool . Per qualche motivo il manuale online non contiene la sezione "ESEMPI DI RISTRUTTURAZIONE" che mi ha dato il suggerimento essenziale.

Per i file JPG solo i seguenti comandi di invocazione dovrebbero fare il lavoro:

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

Spiegazione:

  • -r è per la ricorsione
  • '-FileName<CreateDate'dice a exiftool di rinominare il file conformemente al suo tag EXIF CreateDate(puoi provare altri come ModifyDatese)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'indica come creare la stringa del nome file dall'origine della data " CreateDate" (il " %-c" aggiungerà un contatore in caso di collisioni di file, il " %le" sta per "estensione di file")
    • Nota : ho usato " -FileName<..." qui per rinominare i file e spostarli in un'altra cartella in un solo passaggio. Il manuale sottolinea che è necessario utilizzare la -Directory<...sintassi " " per le operazioni sulle cartelle. Ha funzionato per me in questo modo però.

Dovresti dedicare un po 'di tempo a leggere il manuale di questo potente strumento. Forse c'è un modo ancora più breve: D


1
Gli esempi di rinominazione nella documentazione: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo


2

Il modo più semplice è semplicemente importare i file in jbrout ... quindi (facoltativamente) tutti i file possono avere nomi cambiati in qualcosa orientato al tempo. Oppure potresti scoprire che non hai bisogno di cambiare nome (e jbrout è sufficiente).


1

Ho fatto uno script Python piccolo e non molto ottimizzato che a mio avviso fa quello che intendi:

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

Devi installare questa libreria tilloy.net/dev/pyexiv2
celebdor

1

Per farlo funzionare in Debian Lenny prova questo:

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

In php ho fatto qualcosa del genere:

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

Mentre ci siamo, eccone uno che è più in stile "programmazione gonzo", in bash, usando exiftool, può essere lasciato libero su più directory e / o singoli file in una volta sola. Salta i file con tipi MIME non riconosciuti.

Rinomina le foto usando il DateTimeOriginaltag EXIF ​​(quindi il risultato non è 001.jpgma 2015-12-22_14:43:15.jpg.

Se c'è un conflitto di denominazione, vengono applicate numeri indice: 2015-12-22_14:50:57.1.jpg.

Può essere utile: relabel_photo_with_datetimeoriginal.sh

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.