Menu Chiudi

Pillola #71: Organizzare foto o firmati recuperati, sfruttando la data di scatto EXIF

Mi è capitato di recuperare i dati registrati su di un disco esterno, che aveva perso la struttura.

Recupero

Per chi fosse interessato, procedura seguita è stata:

– creare un’immagine prima di toccare il disco, grazie al comando: # ddrescue -n /dev/sdx ImmagineDisco.img ddrlog.txt

– montare l’immagine creata:

# losetup -f
# losetup -P /dev/loop0 /home/ImmagineDisco.img
# ls /dev/loop0*
# mount /dev/loop0 /mnt/utente/

 – recuperare i dati con photorec:

# cd /home/Foto
# photorec /dev/sdh

 – smonto l’immagine originale:

umount /mnt/utente
losetup -d /dev/loop0

 

Riorganizzare le immagini

Dopo il recupero mi ritrovo con 67 cartelle con i vari file all’interno.

Essendo un disco di 1TB, anche se usato poco ho recuperato più di 100.000 file. Pensare di riorganizzare tutto e ricopiare sul vecchio disco riformattato a mano è praticamente impossibile.

Ho quindi pensato di realizzare due semplici script che permettono di organizzare le immagini in cartelle con la struttura:

CartellaDestinazioneBase/Anno/Mese

dove Anno e Mese rappresenta la data di scatto leggendo i dati EXIF.

 

Prerequisiti

I comandi che servono a leggere i dati EXIF sono:

– sudo apt install exif

– sudo apt install libimage-exiftool-perl

 

Script

#!/bin/bash

_debug=0

# Funzione di help
uso{

echo ""
echo "Uso: ${0##*/} [-dD] -src CartellaSorgente -dst CartellaDestinazione"
echo ""
echo " Organizza le immagini trovate nella cartella sorgente e successive, per posizionarle all'interno della cartella con base destinazione e anno/mese in cui è stata scattata."
echo ""
echo " Opzioni:"
echo " -d, -D: Attiva il debug"
echo " -src: Cartella con le immagini da organizzare"
echo " -dst: Cartella in cui organizzare le immagini"
echo ""

exit 3

}

# Verifica parametri minimi
[[ $# -lt 2 ]] && uso

# Estrazione parametri passati allo script
_parmUnknown=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
-h)
uso;
shift # passo ad altra opzione
;;
-d)
_debug=1
shift # passo ad altra opzione
;;
-D)
_debug=1
set -x
shift # passo ad altra opzione
;;
-src)
_src=$2
shift # passo ad altra opzione
shift # passo il valore corrente
;;
-dst)
_dst=$2
shift # passo ad altra opzione
shift # passo il valore corrente
;;
*) # opzione sconosciuta
_parmUnknown+=("$1") # Salvo il valore in un array per usarlo dopo
shift # passo ad altra opzione
;;
esac
done
set -- "${_parmUnknown[@]}" # ripristino gli argomenti che non ho riconosciuto

# Verifico che i parametri obbligatori siano presenti
if [ "$_dst" == "" ]; then
uso;
elif [ "$_src" == "" ]; then
uso;
fi

# Imposto un file di appoggio
_lista_file="/tmp/${0##*/}"

# Ricerco le immagini partendo dalla cartella sorgente e popolo il file temporaneo
find $_src -iname "*.jpg" > $_lista_file
find $_src -iname "*.png" >> $_lista_file
find $_src -iname "*.tif" >> $_lista_file

while read -r _line;
do
# Per ogni file cerco di leggere la data in cui è stata scattata, se possibile
_data=`exif $_line 2>/dev/null | awk -F "|" '/Data e ora \(dati ori/ {print $2}'`;
_anno=${_data:0:4};
_mese=${_data:5:2};
_giorno=${_data:8:2};
# Imposto una cartella comune se l'anno non è valorizzato
if [ "$_anno" == "" ]; then
_dest2="Senza_data";
else
_dest2="$_anno/$_mese";
fi;
# Verifico che esista la cartella di destinazione, altrimenti la creo
if [ ! -d "$_dst/$_dest2" ]; then
mkdir -p "$_dst/$_dest2";
fi;
# Sposto l'immagine corrente nella cartella di destinazione
mv $_line $_dst/$_dest2/${_line##*/};
done < $_lista_file

rm $_lista_file

 


La versione per i filmati è la seguente:

#!/bin/bash

_debug=0

# Funzione di help
uso{

echo ""
echo "Uso: ${0##*/} [-dD] -src CartellaSorgente -dst CartellaDestinazione"
echo ""
echo " Organizza i filmati trovati nella cartella sorgente e successive, per posizionarli all'interno della cartella con base destinazione e anno/mese in cui è stato girato."
echo ""
echo " Opzioni:"
echo " -d, -D: Attiva il debug"
echo " -src: Cartella con i filmati da organizzare"
echo " -dst: Cartella in cui organizzare i filmati"
echo ""

exit 3

}

# Verifica parametri minimi
[[ $# -lt 2 ]] && uso

# Estrazione parametri passati allo script
_parmUnknown=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
-h)
uso;
shift # passo ad altra opzione
;;
-d)
_debug=1
shift # passo ad altra opzione
;;
-D)
_debug=1
set -x
shift # passo ad altra opzione
;;
-src)
_src=$2
shift # passo ad altra opzione
shift # passo il valore corrente
;;
-dst)
_dst=$2
shift # passo ad altra opzione
shift # passo il valore corrente
;;
*) # opzione sconosciuta
_parmUnknown+=("$1") # Salvo il valore in un array per usarlo dopo
shift # passo ad altra opzione
;;
esac
done
set -- "${_parmUnknown[@]}" # ripristino gli argomenti che non ho riconosciuto

# Verifico che i parametri obbligatori siano presenti
if [ "$_dst" == "" ]; then
uso;
elif [ "$_src" == "" ]; then
uso;
fi

# Imposto un file di appoggio
_lista_file="/tmp/${0##*/}"

# Ricerco i filmati partendo dalla cartella sorgente e popolo il file temporaneo
find $_src -iname "*.mov" > $_lista_file
find $_src -iname "*.mp4" >> $_lista_file
find $_src -iname "*.3gp" >> $_lista_file

while read -r _line;
do
# Per ogni file cerco di leggere la data in cui è stato girato, se possibile
_data=`exiftool $_line 2>/dev/null | awk -F ":" '/Track Create Date/ {gsub(/ /,""); print $2":"$3":"$4}'`;
_anno=${_data:0:4};
_mese=${_data:5:2};
_giorno=${_data:8:2};
# Imposto una cartella comune se l'anno non è valorizzato
if [ "$_anno" == "" ]; then
_dest2="Senza_data";
else
_dest2="$_anno/$_mese";
fi;
# Verifico che esista la cartella di destinazione, altrimenti la creo
if [ ! -d "$_dst/$_dest2" ]; then
mkdir -p "$_dst/$_dest2";
fi;
# Sposto il filmato corrente nella cartella di destinazione
mv $_line $_dst/$_dest2/${_line##*/};
done < $_lista_file

rm $_lista_file

 

WordPress Appliance - Powered by TurnKey Linux