venerdì 16 novembre 2012

Rinominare una serie di file con un unico comando dal Terminale


A chi non è mai capitato di dover rinominare una lunga serie di file, come ad esempio una collezione di foto? Farlo con l'interfaccia grafica di un qualsiasi file manager è una procedura lunga e noiosa, costringendo l'utente a dover cliccare su ogni file per rinominarlo a mano!
Con il comando rename possiamo rinominare una serie di file in un colpo solo.
La sintassi di questo comando è la seguente:

rename [espressione regolare] files

La sintassi dell'espressione regolare è quella di Perl, in sintesi ha questa forma:

s / caratteri da sostituire / nuovi caratteri /

Per quanto riguarda files, possiamo utilizzare delle wildcard per selezionare i file da modificare.
Vediamo alcuni esempi per chiarire:

rename s/.jpeg/.jpg/ *.jpeg

*.jpeg informa rename che deve prendere tutti i file che terminano con .jpeg, quindi l'espressione regolare s/.jpeg/.jpg/ sostituisce ogni occorrenza della stringa .jpeg con la stringa .jpg.
Quindi se abbiamo i file

a.jpg
b.jpeg
c.jpg
d.jpeg

rename modificherà rispettivamente

b.jpeg in b.jpg
d.jpeg in d.jpg.

La sintassi delle espressioni regolari, seppur inizialmente può apparire piuttosto complessa, è uno strumento potente e versatile. Tramite l'uso di metacaratteri possiamo ottenere delle espressioni più complesse, vediamone alcuni:

^    inizio della stringa
$    fine della stringa
*    nessuna o più ripetizioni
+    una o più ripetizioni
{}   numero esatto della ripetizione

Vediamo degli esempi pratici:

rename s/^/foto/ *.jpg

Aggiunge la stringa foto davanti al nome di tutti i file che terminano con .jpg, ad esempio
01.jpg diventerà foto01.jpg.

rename s/$/foto/ *.jpg

Aggiunge la stringa foto alla fine del nome di tutti i file che terminano con .jpg, ad esempio
01.jpg diventerà 01foto.jpg.

rename s/ae*/e/ *

Tutte le occorrenze di una 'a' che sia seguita da nessuna o più 'e', verranno sostituite con e.

rename s/ae+/e/ *

Tutte le occorrenze di una 'a' che sia seguita da una o più 'e', verranno sostituite con e.

rename s/a{3}/a/ *

Tutte le occorrenze di 'aaa' verranno sostituite con 'a'.

Per ulteriori informazioni sulla sintassi di rename potete consultare le istruzioni con il solito
man rename

Mentre per la sintassi delle espressioni regolari in Perl vi segnalo questa pagina.