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
1 |
QUALCOSA-2011-02.xls |
in
1 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-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:
1 2 3 |
bash-2.03$ for ciccio in `find . -type f -name *.xls` ; do mv $ciccio {ciccio%%-2011-02.xls}-2011-01.xls; done |
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à!