Sostituire spazi bianchi con underscore

Inserito da il 5 December 2006, 5146 visite totali

Molto spesso capita di scaricare o di archiviare file il cui nome contiene degli spazi, questo qualche volta può dare di problemi.

Lo script che viene ripostato di seguito serve per rinominare questi file eliminando gli spazi bianchi ed inserire al loro posto degli underscore (_), senza modificare le maiuscole in minuscole o vicerversa.

La particolarità di questo script è che non si limita a rinominare i file contenuti in una directory m riesce a rinominare anche le sotto-directory ed i relativi file partendo dal path in cui viene lanciato fino ad esaurire i file.

L’uso dello script è molto semplice, basta salvare il codice sottostante in un file di testo (ad esempio space4uscore) e dargli i permessi di esecuzione (chmod +x space4uscore)

#!/bin/bash
#script che trasforma gli spazi nei file in underscore(_)
#Riesce a rinominare anche cartelle e sottocartelle
#Lascia invariate Maiuscole e minuscole
#se si vogliono cambiare maiuscole in minuscole basta cambiare
#tr 'A-Z ' 'A-Z_'` in tr 'A-Z ' 'a-z_'`
#Autore Lucio Zara (nick pennega)
#Sito www.spaghettilinux.org
#Mail pennega@gmail.com
#Versione 0.5
#Licenza GPL

#funzione usata per rinominare i file
RENAMEFILE() {
#$FILE non è necessario definirla come locale
local FILE=$1 #$1 è la 1° variabile passata alla funzione al momento della sua invocazione
#se non ho spazi nel nome file non lo devo rinominare
if echo $FILE | grep " " ; then 
	NEWNAMEFILE=`echo $FILE | tr 'A-Z ' 'A-Z_'`
	#rinomino il file $NEWNAMEFILE contiene il nome del file
	#con gli spazi traformati in _
	mv "$FILE" $NEWNAMEFILE	
fi
}

#questa è una funzione ricorsiva
RENAMEDIR() {
#$DIR è necessario definirla come locale
local DIR=$1
if echo $DIR | grep " " ; then 
	NEWNAMEDIR=`echo $DIR | tr 'A-Z ' 'A-Z_'`
	mv "$DIR" $NEWNAMEDIR
else
	#se non ci sono spazi assegno a $NEWNAMEDIR il valor di $DIR
	NEWNAMEDIR=$DIR
fi
#Entro nella dir per verificare se ho altre dir o file
cd $NEWNAMEDIR
find -maxdepth 1 | while read d; do
	#il comando find mi restituisce tra i risultati anche la dir corrente ./
	#che non và considerata
	if [ "$d" != "." ]; then
		#verifico se $d è una directory
		if [ -d "$d" ]; then
			#se $d è una directory richiamo la funzione ricorsivamente
			RENAMEDIR "$d"
		else
			#se $d non è una directory richiamo la funzione RENAMEFILE
			RENAMEFILE "$d"
		fi
	fi
	done
#Visto che prima sono entrato in $NEWNAMEDIR adesso devo uscirne per poter continuare
cd ..
}


#MAIN
find -maxdepth 1 | while read l; do
	#il comando find mi restituisce tra i risultati anche la dir corrente ./
	#che non và considerata
	if [ "$l" != "." ]; then
		#verifico se ho una directory
		if [ -d "$l" ]; then
			#ricchiamo la funzione RENAMEDIR
			RENAMEDIR "$l"
		else
			#ricchiamo la funzione RENAMEFILE
			RENAMEFILE "$l"
		fi
	fi
done

NB: la funzione che si occupa di rinominare le directory, RENAMEDIR, è definita ricorsivamente e potrebbe dare qualche problema se il livello di sotto-directory da rinominare è alto, si parla di un livello di 30-40 sotto-directory.

Se riscontrate qualche problema nell’utilizzo dello script, o apportate qualche miglioria non esistate a comunicarlo, o via email all’autore, o se preferite lasciando un comento allo script.

Lo script è disponibile per il download sul server FTP.

4 commenti per “Sostituire spazi bianchi con underscore”

  1. Grazie e complimenti per il lavoro che avete svolto.
    Continuiamo così!

    Colgo l’ occasione per fare gli auguri di buon anno a tutto lo staff.

  2. Riccardo scrive:

    Grazie, l’ho usato proprio oggi per convertire da mauiscuolo a minuscolo.

  3. chicco00 scrive:

    Ciao,

    dopo mille giri sono approdato a questo script che sembra essere perfetto.
    Ho solo un problema, e penso di aver capito che dipende dal fatto che il nome delle directories alle quali voglio togliere gli spazi bianchi comprende le parentesi tonde (del tipo: 2009-11 (disegni a casa) ).

    Come posso fare? E’ necessario togliere anche quelle?

    grazie mille!!

  4. pennega scrive:

    mmmmm si probabilmente il problema ̬ quello in quanto le () vanno escapate ora non ho modo di provare ma magari puoi risolvere semplicemente cambiado la funzione tr aggiungendo le () e poi Р-, insomma qualcosa tipo

    NEWNAMEFILE=`echo $FILE | tr 'A-Z() ' 'A-Z--_'`

    così le () diventano dei trattini

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *