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à!