Azioni

Differenze tra le versioni di "Script per rinonimare file dalla macchina digitale con la data"

Da MontelLUG WIKI.

 
m (Spiegazione)
 
(11 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
== Script per rinominare file di immagini ==
+
{{navmenu_exp|
 +
padre=
 +
Shell_Tricks
 +
}}
 +
Spesso è utile per catalogare le immagini acquisite con una macchina digitale poterle rinominare in modo coerente, includendo nel nome la loro data di generazione e una stringa che aiuti ad identificarle, numerando poi le immagini secondo un numero progressivo. Questo si può fare semplici script, che tengano conto della data del file immagazzinata nel sistema, oppure ancora meglio delle informazioni EXIF che ormai quasi tutte le macchine digitali incorporano nei file JPEG.
  
Spesso è utile per catalogare le immagini acquisite con una macchina digitale poterle rinominare in modo coerente, includendo nel nome la loro data di generazione e una stringa che aiuti ad identificarle, numerando poi le immagini secondo un numero progressivo. Questo si può fare semplici script, che tengano conto della data del file immagazzinata nel sistema, oppure ancora meglio delle informazioni EXIF che ormai quasi tutte le macchine digitali incorporano nei file JPEG.
+
== Avvertenza ==
 +
Gli script presentati in questa pagina sono assolutamente senza alcuna garanzia.
 +
Usarli a proprio rischi e pericolo.
  
 
== Versione POSIX - Data di sistema ==
 
== Versione POSIX - Data di sistema ==
Riga 14: Riga 20:
 
# Parametri da linea si comando:
 
# Parametri da linea si comando:
 
# N.1: Percorso che contiene i file
 
# N.1: Percorso che contiene i file
# N.2: Parte iniziale del nome da dare ai file
+
# N.2: Eventuale parte iniziale del nome da dare ai file
 +
 
 +
if [ "$1" == "" ];
 +
then
 +
        echo "Sintassi: rinomina directory [prefisso]"
 +
        exit 1
 +
fi
 +
 
 +
# togli lo spazio dai delimitatori                                                                             
 +
IFS=${IFS// /}
  
#Svuota il file delle date per essere sicuri che non esista
 
rm -f $1/filedate.txt
 
touch $1/filedate.txt
 
 
# La lista dei file viene ordinata secondo la data
 
# La lista dei file viene ordinata secondo la data
 
for FILE in $(ls -t $1/*.jpg);
 
for FILE in $(ls -t $1/*.jpg);
 
do
 
do
# Prende la data del file
+
        # Prende la data del file
DATA=$(stat --format=%y $FILE | cut -c 1-10)
+
        DATA=$(stat --format=%y $FILE | cut -c 1-10)
# Verifica se la data e' la stessa di altri file precedenti
+
        # confronta con la vecchia
ESISTE=$(cat $1/filedate.txt | grep $DATA)
+
        if [ "$OLDATA" != "$DATA" ];
if [ -z $ESISTE ];
+
        then
  then
+
                # se diverse reinizializza il contatore
  # Se la data e' nuova la aggiunge al file e porta il contatore a 1
+
                NUM=0;
  echo $DATA >> $1/filedate.txt
+
                OLDATA=$DATA;
  NUM=$((1));
+
        fi
  else
+
        # incremente il contatore
  # Se la data e' la stessa di altri file incrementa il contatore
+
        NUM=$[NUM+1];
  NUM=$(($NUM+1));
+
        # stampa il comando con numero incrementato preceduto da zeri per arrivare a 5 cifre
fi
+
        mv -i $FILE $1/$2$DATA\_$(echo "n=5; for (c=0; c<=l($NUM)/l(10); ++c) z=z;\
# Rinomina il file
+
        for (i=0; i<n-c; ++i) print(0);" | bc -l;)$NUM.jpg
mv $FILE $1/$2-$DATA\_$NUM.jpg;
 
 
done
 
done
# Cancella il file delle date
 
rm $1/filedate.txt
 
 
</nowiki>
 
</nowiki>
 
</pre>
 
</pre>
  
== Spiegazione ==
+
=== Spiegazione ===
 
Questo script si basa sulla data di sistema, quindi è compatibile con tutti
 
Questo script si basa sulla data di sistema, quindi è compatibile con tutti
 
i sistemi che usano la shell bash, e funziona di principio con ogni tipo di file, non
 
i sistemi che usano la shell bash, e funziona di principio con ogni tipo di file, non
soltanto i .jpg. In compenso non legge le informazioni EXIF, quindi la data
+
soltanto i .jpg.
 +
 
 +
In compenso non legge le informazioni EXIF, quindi la data
 
sara quella in cui i file vengono downloadati nel disco fisso (a meno che
 
sara quella in cui i file vengono downloadati nel disco fisso (a meno che
non si rinomino direttamente nella memoria della macchina digitale). Il
+
non si rinomino direttamente nella memoria della macchina digitale, o, meglio,
trucco principale sta nell'uso del parametro -t nel generare la lista di
+
che si copino col parametro (non posix) -p che preserva gli attributi).
 +
 
 +
Il trucco principale sta nell'uso del parametro -t nel generare la lista di
 
file per il ciclo for: questo consente che non ci siano ripetizioni nel file
 
file per il ciclo for: questo consente che non ci siano ripetizioni nel file
 
contenente le date e che quindi i numeri progressivi dei file che hanno la
 
contenente le date e che quindi i numeri progressivi dei file che hanno la
Riga 56: Riga 69:
 
consente una maggiore flessibilità nelle informazioni da visualizzare sul
 
consente una maggiore flessibilità nelle informazioni da visualizzare sul
 
file.
 
file.
 +
 +
== Versione che usa exiftags ==
 +
 +
<pre>
 +
<nowiki>
 +
#!/bin/sh
 +
 +
# Script per la rinominazione dei file
 +
# della macchina fotografica con la data
 +
 +
# Parametri da linea si comando:
 +
# N.1: Percorso che contiene i file
 +
# N.2: Eventuale parte iniziale del nome da dare ai file
 +
 +
if [ "$1" == "" ];
 +
then
 +
        echo "Sintassi: rinjpg-exiftags directory [prefisso]"
 +
        exit 1
 +
fi
 +
               
 +
 +
# togli lo spazio dai delimitatori
 +
IFS=${IFS// /}
 +
 +
# cancella file datefoto.txt
 +
if [ -f /tmp/datefoto.txt ];
 +
then
 +
        rm /tmp/datefoto.txt
 +
fi
 +
 +
# leggi date di creazione di tutte le jpg
 +
for f in $1/*.jpg;
 +
do
 +
        data=$(exiftags -v $f | grep 'Image Generated:' | cut -c 18-36 | sed 's/:/-/g');
 +
        # se c'e' la data...
 +
        if [ "$data" != "" ];
 +
        then
 +
                echo $data $f >> /tmp/datefoto.txt;
 +
        fi
 +
        sort -o /tmp/datefoto.txt /tmp/datefoto.txt
 +
done
 +
 +
# cicla per tutti i file jpg (anche se il nome contiene spazi) ordinati per data
 +
for x in $(cat /tmp/datefoto.txt);
 +
do
 +
        # memorizza nuova data
 +
        data=${x:0:10}
 +
        # confronta con la vecchia
 +
        if [ "$oldata" != "$data" ];
 +
        then
 +
                # se diverse reinizializza il contatore
 +
                c=0;
 +
                oldata=$data;
 +
        fi
 +
        # incremente il contatore
 +
        c=$[c+1];
 +
        # stampa il comando con numero incrementato preceduto da zeri per arrivare a 5 cifre
 +
        mv -i ${x:20} $1/$2$data\_$(echo "n=5; for (c=0; c<=l($c)/l(10); ++c) z=z;\
 +
        for (i=0; i<n-c; ++i) print(0);" | bc -l;)$c.jpg
 +
done
 +
</nowiki>
 +
</pre>
 +
 +
=== Spiegazione ===
 +
La differenza principale rispetto alla versione precedente e' che i file devono essere ordinati
 +
per data manualmente. Per questo viene creato un file contenente le date e i nomi dei file
 +
e viene ordinato semplicemente col sort.<br>
 +
Una volta che si hanno data e nome file in ordine si procede come nella versione precedente.

Versione attuale delle 18:29, 2 mar 2005

Menu
MontelLUG frontpage
Aiuto: Come modificare le pagine
Torna indietro

Spesso è utile per catalogare le immagini acquisite con una macchina digitale poterle rinominare in modo coerente, includendo nel nome la loro data di generazione e una stringa che aiuti ad identificarle, numerando poi le immagini secondo un numero progressivo. Questo si può fare semplici script, che tengano conto della data del file immagazzinata nel sistema, oppure ancora meglio delle informazioni EXIF che ormai quasi tutte le macchine digitali incorporano nei file JPEG.

Avvertenza

Gli script presentati in questa pagina sono assolutamente senza alcuna garanzia. Usarli a proprio rischi e pericolo.

Versione POSIX - Data di sistema


#!/bin/sh

# Script per la rinominazione dei file
# della macchina fotografica con la data

# Parametri da linea si comando:
# N.1: Percorso che contiene i file
# N.2: Eventuale parte iniziale del nome da dare ai file

if [ "$1" == "" ];
then
        echo "Sintassi: rinomina directory [prefisso]"
        exit 1
fi

# togli lo spazio dai delimitatori                                                                              
IFS=${IFS// /}

# La lista dei file viene ordinata secondo la data
for FILE in $(ls -t $1/*.jpg);
do
        # Prende la data del file
        DATA=$(stat --format=%y $FILE | cut -c 1-10)
        # confronta con la vecchia
        if [ "$OLDATA" != "$DATA" ];
        then
                # se diverse reinizializza il contatore
                NUM=0;
                OLDATA=$DATA;
        fi
        # incremente il contatore
        NUM=$[NUM+1];
        # stampa il comando con numero incrementato preceduto da zeri per arrivare a 5 cifre 
        mv -i $FILE $1/$2$DATA\_$(echo "n=5; for (c=0; c<=l($NUM)/l(10); ++c) z=z;\
        for (i=0; i<n-c; ++i) print(0);" | bc -l;)$NUM.jpg
done

Spiegazione

Questo script si basa sulla data di sistema, quindi è compatibile con tutti i sistemi che usano la shell bash, e funziona di principio con ogni tipo di file, non soltanto i .jpg.

In compenso non legge le informazioni EXIF, quindi la data sara quella in cui i file vengono downloadati nel disco fisso (a meno che non si rinomino direttamente nella memoria della macchina digitale, o, meglio, che si copino col parametro (non posix) -p che preserva gli attributi).

Il trucco principale sta nell'uso del parametro -t nel generare la lista di file per il ciclo for: questo consente che non ci siano ripetizioni nel file contenente le date e che quindi i numeri progressivi dei file che hanno la stessa data siano corretti e non ci siano sovrapposizioni o salti. Per ricavare la data del file si usa il comando stat piuttosto che ls perchè consente una maggiore flessibilità nelle informazioni da visualizzare sul file.

Versione che usa exiftags


#!/bin/sh

# Script per la rinominazione dei file
# della macchina fotografica con la data

# Parametri da linea si comando:
# N.1: Percorso che contiene i file
# N.2: Eventuale parte iniziale del nome da dare ai file

if [ "$1" == "" ];
then
        echo "Sintassi: rinjpg-exiftags directory [prefisso]"
        exit 1
fi
                

# togli lo spazio dai delimitatori
IFS=${IFS// /}

# cancella file datefoto.txt
if [ -f /tmp/datefoto.txt ];
then
        rm /tmp/datefoto.txt
fi

# leggi date di creazione di tutte le jpg
for f in $1/*.jpg;
do
        data=$(exiftags -v $f | grep 'Image Generated:' | cut -c 18-36 | sed 's/:/-/g');
        # se c'e' la data...
        if [ "$data" != "" ];
        then
                echo $data $f >> /tmp/datefoto.txt;
        fi
        sort -o /tmp/datefoto.txt /tmp/datefoto.txt
done

# cicla per tutti i file jpg (anche se il nome contiene spazi) ordinati per data
for x in $(cat /tmp/datefoto.txt);
do
        # memorizza nuova data
        data=${x:0:10}
        # confronta con la vecchia
        if [ "$oldata" != "$data" ];
        then
                # se diverse reinizializza il contatore
                c=0;
                oldata=$data;
        fi
        # incremente il contatore
        c=$[c+1];
        # stampa il comando con numero incrementato preceduto da zeri per arrivare a 5 cifre
        mv -i ${x:20} $1/$2$data\_$(echo "n=5; for (c=0; c<=l($c)/l(10); ++c) z=z;\
        for (i=0; i<n-c; ++i) print(0);" | bc -l;)$c.jpg
done

Spiegazione

La differenza principale rispetto alla versione precedente e' che i file devono essere ordinati per data manualmente. Per questo viene creato un file contenente le date e i nomi dei file e viene ordinato semplicemente col sort.
Una volta che si hanno data e nome file in ordine si procede come nella versione precedente.