Importo spesso foto e video (per lo più con estensioni JPG e MOV) da fotocamere digitali e tablet al mio PC e, idealmente, vorrei vederli ordinati in base a data e ora di acquisizione già presenti nei loro dati EXIF. E da qui il mio desiderio di rinominarli tutti preferibilmente utilizzando un semplice Script Nautilus inserendo preferibilmente la data e l'ora prima di ogni nome di file.
Finora sono riuscito solo a mettere insieme il seguente Nautilus Script, che credo sia tutt'altro che perfetto:
for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i""
done
Quello che non mi piace in questo metodo di ridenominazione sono i due punti utilizzati nei timbri di data e ora EXIF (ad es. “2013:09:03 20:55:09_IMG_0108.JPG”) che potrebbero creare problemi durante il trasferimento successivo di questi file in altri ambienti (ad es. Windows).
Questo comando (usando exiv2 invece di exiftool ) consente comodamente la manipolazione di data e ora, ma il suo svantaggio è che non funziona sui file video (ad es. MOV) :
exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"
Quindi spero che qualcuno possa trovare una soluzione migliore. E sarebbe magico se riuscisse a convertire anche i nomi dei file e le estensioni originali in minuscolo!
Risposta accettata:
Quello che non mi piace in questo metodo di ridenominazione sono i due punti utilizzati nei timbri di data e ora EXIF (ad es. "2013:09:03 20:55:09_IMG_0108.JPG") che potrebbero creare problemi durante il trasferimento di questi file in un secondo momento in altri ambienti ( es. Windows).
Puoi eseguire lo schema di denominazione tramite sed
, per sostituire i due punti con trattini e spazi con trattini bassi, in questo modo:
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"
Per quanto riguarda il minuscolo, puoi usare rename
:
rename 's/(.*)/\L$1/' file.JPG
## or
rename 's/(.*)/\L$1/' *.*
Oppure potresti farlo all'interno del tuo script usando sed
, come in:
j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')
…e poi usa il $j
variabile al posto del $i
finale del tuo mv
linea. Questo modo sed è leggermente più portabile (se questo è importante per te) poiché diverse distribuzioni Linux hanno comandi di ridenominazione diversi, mentre sed è universale.
Oppure, in alternativa, lo script può essere modificato come segue per eseguire la conversione del nome del file in minuscolo all'inizio utilizzando tr
invece:
for arg
do
tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done
Per eseguire comandi leggermente diversi per diversi tipi di file, in questo script è possibile utilizzare un'istruzione bash case. Ad esempio:
#! /usr/bin/env bash
for filename in ./*
do
tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
case "$filename" in
*.MOV|*.mov)
mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
;;
*.JPG|*.jpg)
mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
;;
*)
echo 'Not a *.jpg or a *.mov!'
;;
esac
done
In questo esempio, la ridenominazione di file MOV con timestamp CreateDate QUALSIASI NUMERO di ore DOPO O PRIMA dei file JPG viene regolata utilizzando un altro (-tur) dati EXIF e rimuovendo il suffisso della differenza di orario, e potrebbe essere necessario modificare -tur parte in base alla posizione impostata nel sistema.