Renaming multiplo con RENAME

Con rename possiamo simulare attraverso il parametro -n cosa la shell ci restituirà senza effettuare variazioni. Qui di seguito ripetiamo i passi visti con mv utilizzando pesantemente le REGEXP. Le REGEXP, come più volte scritto qui su Pianeta.com, inizialmente sono ostiche, poi però se ci si applica studiandole e sperimentandole ci si rende conto che tutto sommato non sono questa cosa impossibile.

Gli esempi illustrati qui di seguito fanno leva sul meccanismo di sostituzione indicato con s:
s/search/replace/
che vuol dire che si cerca nel testo search e lo si sostituisce con replace (per maggiori dettagli vedi da console info sed ---> "s" command)

ecco come rinominare 00005.jpg in cinque.jpg
rename -v 's/00005/cinque/' 00005.jpg

Chiarito questo passiamo agli esempi.

Come negli esempi con mv la struttura della directory è composta da file JPEG nominati da 00001.jpg a 00100.jpg

Esempio 1
In questo esempio verrà aggiunta la parola wallpaper ai nomi dei files .jpg presenti nella directory corrente.

ls ora restituisce:
00001.jpg 00002.jpg 00003.jpg 00004.jpg 00005.jpg ..... 00100.jpg

aggiungere la parola wallpaper ai file jpg della directory:
rename -v 's/(\d{5})\.jpg$/wallpaper$1\.jpg/' *.jpg

ls ora restituisce:
wallpaper00001.jpg wallpaper00002.jpg wallpaper00003.jpg wallpaper00004.jpg wallpaper00005.jpg ..... wallpaper00100.jpg

Spiegazione:
- con s indichiamo che vogliamo effettuare una sostituzione
- con d{5} indichiamo le 5 cifre del nome del file
- che precedono l'estensione .jpg indicata con \.jpg$ dove il \ effettua l'escape del punto essendo questo un carattere speciale (quindi viene identificato come un semplice punto e non un carattere speciale) mentre il $ indica che dopo jpg si è giunti alla fine del testo
- (\d{5}) è stato messo tra parentesi tonde perchè viene raccolto da $1 subito dopo wallpaper (spieghiamo meglio di seguito)
- lo / che precede wallpaper indica che ci troviamo nel zona replace della REGEXP e tutto quello che c'è qui contenuto andrà a sostituire quello che c'è nella zona precedente search che ricordiamo essere \d{5}\.jpg$ (cioè le 5 cifre e l'estensione .jpg, quindi tutti i file da 00001.jpg a 00100.jpg)
- in questa zona replace troviamo wallpaper$1\.jpg che sta ad indicare che si andrà ad anteporre la parola wallpaper a $1
- $1 è il contenuto del primo (e in questo caso unico) set di parentesi tonde cioè (\d{5}) equivalente alle prime 5 cifre dei nomi dei files
- subito dopo $1 troviamo \.jpg/ dove il \ esegue l'escape del punto mentre lo / indica che la chiusura della zona replace è stata raggiunta
- poi il *.jpg indica che la ricerca viene fatta su tutti i file con estensione .jpg

Per capire quel $1 si pensi a questo esempio che restituisce lo stesso risultato:
rename -n 's/(\d{3})(\d{2})\.jpg$/wallpaper$1$2\.jpg/' *.jpg

In sostanza nella zona search abbiamo utilizzato due set di parentesi.
Il primo (\d{3}) che corrisponde a $1 sono le prime 3 cifre quindi 000.
Il secondo (\d{2}) che corrisponde a $2 sono le 2 cifre attigue quindi 00.

Esempio 2
Sostituiamo wallpaper con immagine nei nomi dei file .jpg della directory corrente.

ls ora restituisce:
wallpaper00001.jpg wallpaper00002.jpg wallpaper00003.jpg wallpaper00004.jpg wallpaper00005.jpg ..... wallpaper00100.jpg

sostituzione di wallpaper in immagine:
rename -v 's/wallpaper/immagine/' *.jpg

ls ora restituisce:
immagine00001.jpg immagine00002.jpg immagine00003.jpg immagine00004.jpg immagine00005.jpg ..... immagine00100.jpg

Esempio 3
Ripristinare la situazione iniziale quindi togliendo wallpaper

ls ora restituisce:
immagine00001.jpg immagine00002.jpg immagine00003.jpg immagine00004.jpg immagine00005.jpg ..... immagine00100.jpg

sostituzione di wallpaper in niente:
rename -v 's/immagine//' *.jpg

ls ora restituisce:
00001.jpg 00002.jpg 00003.jpg 00004.jpg 00005.jpg ..... 00100.jpg

Fonte: www.pianeta.com