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