Cambiare una parte del nome a una serie di file

Vi siete mai chiesti come poter rinominare in maniera automatica una parte del nome di un file e come poter ripetere questa operazione, anche su migliaia di file, in una volta sola?
Supponiamo che vi venga chiesto di cambiare nome a una serie di un file chiamati

QUALCOSA-2011-02.xls

in

QUALCOSA-2010-01.xls

Come procedereste per farlo utilizzando un unico comando da shell?

Per prima cosa, spostate tutti i file da rinominare in una cartella apposita,
in modo da ottenere un elenco simile a questo:

-rw-r--r--   1 utente    gruppo    2415 Apr  2 12:34 BIOLOGIA-2011-02.xls
-rw-r--r--   1 utente    gruppo    3002 Apr  2 12:34 CHIMICA-2011-02.xls
-rw-r--r--   1 utente    gruppo  111924 Apr  2 12:34 ECONOMIA-2011-02.xls
-rw-r--r--   1 utente    gruppo   16876 Apr  2 12:34 FISICA-2011-02.xls
-rw-r--r--   1 utente    gruppo    1666 Apr  2 12:34 GEOLOGIA-2011-02.xls
-rw-r--r--   1 utente    gruppo  116345 Apr  2 12:34 GIURISPRUDENZA-2011-02.xls
-rw-r--r--   1 utente    gruppo   46985 Apr  2 12:34 INFORMATICA-2011-02.xls
-rw-r--r--   1 utente    gruppo   70292 Apr  2 12:34 MATEMATICA-2011-02.xls
-rw-r--r--   1 utente    gruppo   98333 Apr  2 12:34 MEDICINA-2011-02.xls
-rw-r--r--   1 utente    gruppo   12212 Apr  2 12:34 OPERE_GENERALI-2011-02.xls
-rw-r--r--   1 utente    gruppo   76271 Apr  2 12:34 PSICOLOGIA-2011-02.xls
-rw-r--r--   1 utente    gruppo   44121 Apr  2 12:34 SCIENZE_DELLA_FORMAZIONE-2011-02.xls
-rw-r--r--   1 utente    gruppo  124910 Apr  2 12:34 SOCIOLOGIA-2011-02.xls
-rw-r--r--   1 utente    gruppo   29047 Apr  2 12:34 STATISTICA-2011-02.xls

che non contenga file spurii e non abbia sottocartelle.

A questo punto basta un semplice trucco di parameter substitution in bash e un ciclo for:

[bash gutter=”false” ruler=”false” toolbar=”false”]
bash-2.03$ for ciccio in `find . -type f -name *.xls` ;
do mv $ciccio ${ciccio%%-2011-02.xls}-2011-01.xls;
done
[/bash]

Nello script qui sopra, ho detto al comando for di inserire nella variabile $ciccio
tutti i nomi dei file trovati dal comando find che hanno estensione .xls.
Ora viene il bello: utilizzando la parameter substitution di bash dico al comando mv di rinominare il nome del file corrente all’interno del ciclo for, contenuto nella variabile $ciccio, in qualcosa composto da parte della variabile $ciccio, in cui però al posto di 2011-02.xls venga sostituito 2010-01.xls
Voilà!