Se possedete una fotocamera digitale, sicuramente avrete avuto la necessità di rinominare un insieme grande di foto in maniera automatica, anche perché farlo a mano, al di là degli eventuali errori, si rivelerebbe essere un’operazione lunga e tediosa. Molti software di gestione foto, infatti, permettono questa operazione. Supponiamo per esempio di avere una serie di foto del genere:
DSCN5584.JPG DSCN5585.JPG DSCN5586.JPG DSCN5587.JPG ...
e di volerli rinominare nel seguente modo:
Sardegna_001.jpg Sardegna_002.jpg Sardegna_003.jpg Sardegna_004.jpg ...
Più chiaro per quando le vorremo rivedere. Vediamo come si può fare una cosa del genere con un semplicissimo script Linux. Lo scopo è quello di fare uno scritp che poi chiamaremo con il comando:
$./fotorenumber Sardegna_###.jpg 1
dove con i 3 “###” indichiamo che in quello spazio ci deve essere un numero di 3 cifre (quindi 001, 002, 003 etc.) e il parametro “1″ indica che il conteggio deve iniziare da 1. Vediamo il codice e commentiamolo:
#!/bin/bash
ARG=2
if [ $# -ne "$ARG" ]
then
echo "Usage: `basename $0` <basename (use \"#\" for number)> <start number>"
exit $E_ERR_ARG
fi
Queste prime righe di codice servono semplicemente a controllare , in maniera abbastanza blanda, che lo script sia stato invocato nella maniera corretta (viene solo verificato se il numero di parametri è coerente).
#conta i caratteri '#' nel basename
NUMPOUNDS=`echo "$1" | grep -o "#" | wc -l`
Queste righe contano i caratteri “#” nel primo parametro, per sapere di quante cifre deve essere il numero. Come si vede, è stato usato un “grep” che restituisce una riga per ogni “#” trovato, seguito da un “wc” che conta quante righe sono state stampate.
NLEFT=`echo $1 | grep -o "^[^#]*"`
NRIGHT=`echo $1 | grep -o "[^#]*$"`
Queste due righe estraggono rispettivamente la parte all sinistra e alla destra dei “###”, che ci serviranno dopo, perché in mezzo ci andremo a mettere il numero vero e proprio.
COUNTER=$2
for FILENAME in *; do
Dopo aver inizializzato il contatore, cicliamo sui vari file presenti nella cartella (in ordine alfabetico).
NEWNAME=`printf "${NLEFT}%0${NUMPOUNDS}d${NRIGHT}" "$COUNTER"`
Usiamo il comando printf (si usa proprio coma la printf() del C ) per creare il nuovo nome col numero formattato.
echo "Renaming $FILENAME into $NEWNAME"
mv "$FILENAME" "$NEWNAME"
let COUNTER=$COUNTER+1
Rinominiamo e incrementiamo il contatore.
done
Il gioco è fatto, adesso se volete rinominare una cartella con tante foto, basta che andiate nella cartella e digitiate il comando:
$/home/nomeutente/bin/fotorenumber Sardegna_###.jpg 1


