Leggere la data di creazione di una serie di foto dai dati EXIF

Personalmente non utilizzo alcun programma per archiviare le mie foto, ma le raccolgo semplicemente in comunissime directory.
Per il loro ordinamento, quindi, mi affido solamente al nome del file stesso, già in un formato progressivo in quanto i file sono presi direttamente dalla fotocamera. Ci penserà il gestore dei file ad ordinare tutto in ordine alfabetico.
Molto spesso, però, mi capita di dover archiviare delle foto di un evento, ma scattate con fotocamere diverse. Poco male, basta copiare tutte le foto nella stessa directory e l'archivio è creato! ...quasi!
Il problema è che ogni fotocamera salva i file con un nome progressivo diverso, ed il risultato è che poi le foto non sono ordinate nella giusta sequenza cronologica.
Questo script legge la data di scatto di ciascuna foto direttamente dai dati EXIF delle stesse e rinomina poi ogni file utilizzando la data stessa.
A questo punto le foto saranno ordinate nella giusta sequenza cronologica.

Lo script utilizza i pacchetti imagemagik ed exif.

Attenzione all'estensione dei file! Poichè linux è case sensitive, rinominare prima tutti i file in minuscolo poichè lo script cercherà *.jpg e non *.JPG.
Basterà lanciare il comando:

rename 'y/A-Z/a-z/' *

 

Listato del file:

 

 

#!/bin/bash

find . -type f -iname '*.jpg' | while read file
do
  # exif -t 0x9003 = 'Date (original)'
  exif_time=$( exif -t 0x9003 "$file" 2>/dev/null | grep -oP '\d{4}.\d{2}.\d{2} \d{2}.\d{2}.\d{2}' )
  status=$?
  if [ "$status" == "0" ]  # Salta i file senza data salvata in exif o senza campo data
  then
    echo "$file" "$exif_time"
    vecchionome="${file##*/}"
    prefisso=$( echo "$exif_time" | sed -e 's/://g' -e 's/ /_/g' )_
    altro_prefisso="${prefisso:0:13}_"
    # Generazione di 2 possibili nuovi nomi di file
    nuovonome1="${prefisso}${vecchionome}"
    nuovonome2="${altro_prefisso}${vecchionome}"
    # ------------------------------------
    # ED ORA LE POSSIBILI AZIONI:
    # ------------------------------------
    # Stampo a video i nomi dei file
    echo "$vecchionome" "$nuovonome1" "$nuovonome2"
    # Oppure salvo tutta la lista in un file di testo
    echo "$vecchionome" "$nuovonome1" >> nomefile.txt
    # Oppure rinomino direttamente i file con il nuovonome1
    mv -Tv "$file" "$nuovonome1"
  fi
done