[Solira] rinomina multipla

KatolaZ me a katolaz.homeunix.net
Dom 8 Gen 2012 10:56:50 CET


On Sat, Jan 07, 2012 at 01:25:42PM +0100, Nunzio Brugaletta wrote:
> Il giorno sab, 07/01/2012 alle 13.03 +0100, KatolaZ ha scritto:
> > puoi provare con qualcosa tipo:
> > 
> > for i in `ls IMG_*.JPG`; do name=`basename $i ".JPG" | sed -r 's/IMG_/img_/g'`.jpg;
> > mv $i $name; done
> 
> Ok ci siamo. Grazie. Io avevo provato, seguendo la falsariga del
> suggerimento precedente, con la forza bruta a togliere IMG dall'inizio e
> poi ad aggiungere img, ma in questo modo con un unico script risolvo
> tutto. Grazie ancora
> 

Di niente. Forse pero' avrei dovuto spiegare cosa fa lo script, cosi'
in futuro puo' essere utile ad altri. 

Allora, il costrutto "for i in <lista>; do <lista_di_comandi>; done"
esegue un ciclo su tutti gli elementi di una lista (cioe' stringhe
separate da spazi, caratteri di tabulazione o "invio") e per ciascun
elemento della lista esegue una lista_di_comandi.

Nel nostro caso la lista su cui fare l'iterazione e' il risultato
dell'esecuzione di un altro comando, ossia

ls IMG_*.JPG

che viene messo tra apici inversi (perche' cosi' viene eseguito in 
una subshell). Nella lista_di_comandi i comandi vanno separati da un
";", quindi nel nostro caso abbiamo due comandi in lista, e precisamente:

name=`basename $i ".JPG" | sed -r 's/IMG_/img_/g'`.jpg

e

mv $i $name

Il primo e' una assegnazione ad una variabile di shell, che abbiamo
chiamato "name", del risultato dell'esecuzione di un altro comando
(ancora tra apici inversi) concatenato alla stringa ".jpg".  Il
comando tra apici inversi inizia chiamando basename sull'elemento
della lista (che e', ricordiamo, il nome di un file che inizia per
IMG_ e finisce per .JPG). basename trasforma un pathname dato come
primo argomento, restituendo il nome del file *senza il path di
directory* che lo contraddistingue all'interno del filesystem. Se a
basename diamo un secondo parametro (nel nostro caso la stringa
".JPG"), allora basename rimuove quella stringa dalla fine del nome
del file. Il risultato di basename, allora, e' quello di restituirci
il nome del nostro file *senza* l'estensione ".JPG", visto che il
primo parametro e' $i (ossia il valore della variabile i, ossia il
nome dell'elemento della lista che stiamo considerando), e il secondo
e' proprio ".JPG".

A questo punto, l'output di basename viene dato in ingresso (mediante
"|") all'input di un secondo comando, ossia "sed". sed prende in
ingresso un comando (stile ed o vi) e una stringa, e applica quel
comando alla stringa. Nel nostro caso il comando dato a sed e'
"s/IMG_/img_/g" che, senza scendere nei dettagli, significa
"sostituisci tutte le occorrenze della stringa 'IMG_' con 'img_'. Nel
nostro caso, questo comando viene eseguito sul risultato di basename,
ossia sul nome del file senza l'estensione ".JPG". Quindi il risultato
di questo primo comando tra apici inversi (concatenazione di basenane
e sed) e' quello di trasformare una stringa del tipo :

IMG_16538.JPG

in: 

img_16538

A questo punto, prima di assegnare questo valore alla variabile
"name", gli aggiungiamo ".jpg", semplicemente postponendola dopo il
secondo apice inverso. Cosi' facendo la variabile "name" contiene il
valore "img_16538.jpg", che e' guardacaso propio il nome che vorremmo
dare al nostro file iniziale IMG_16538.JPG. Quindi non ci resta che
fare un move (mv) di $i in $name, ossia "mv $i $name", e chiudere il
ciclo.

My2cents

KatolaZ

-- 
[ Enzo Nicosia aka KatolaZ --- GLUG Catania -- Freaknet Medialab ]
[ me [at] katolaz.homeunix.net -- http://katolaz.homeunix.net -- ]
[ GNU/Linux User:#325780/ICQ UIN: #258332181/GPG key ID 0B5F062F ]
[ Fingerprint: 8E59 D6AA 445E FDB4 A153 3D5A 5F20 B3AE 0B5F 062F ]


Maggiori informazioni sulla lista Solira