Eliminare gli spazi dai nomi dei file

Autore dello script: Lucio Zara | Sito Web: http://www.spaghettilinux.org

Alle volte mi succede di dover visualizzare documenti provenienti da utenti che utilizzano altri sistemi operativi e vedo che i nomi dei file, molto spesso, sono scritti con degli spazi al loro interno. Chiaramente questa non è una difficoltà insormontabile, ma può essere fonte di errori se dobbiamo utilizzare i nomi dei file come argomento per l'esecuzione di script bash.

Consiglio: quando create o salvate un file chiamatelo semplicemente:

mio_file_importante.txt

oppure

foto-della-mia-estate.jpg

piuttosto di:

Mio File ImPortante.TXT e Foto della MIA Estate.jpg

con gli spazi sostituiti da trattino alto ( - ) o da trattino basso ( _ ).

Dopo alcune ricerche ho trovato questo script che utilizzo molto spesso. Devo dire che ha anche la possibilità di trasformare da maiuscolo a minuscolo le lettere che compongono il nome del file, ma preferisco utilizzare un altro script dedicato esclusivamente allo scopo che potete trovare qui.

Ecco il codice sorgente:

#!/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 va considerata
if [ "$l" != "." ]; then
#verifico se ho una directory
if [ -d "$l" ]; then
#richiamo la funzione RENAMEDIR
RENAMEDIR "$l"
else
#richiamo la funzione RENAMEFILE
RENAMEFILE "$l"
fi
fi
done

Utilizzo

Per utilizzare lo script è sufficiente renderlo eseguibile.
Per maggiore comodità consiglio di installarlo nella directory /usr/local/bin, in questo modo l'esecuzione avviene semplicemente digitando in un terminale:

sp2under.sh

in qualsiasi directory vi trovate.

Screenshot

screenshot del risultato dello script  screenshot del risultato dello script

Scarica lo script

Ti è piaciuto l'articolo? Se vuoi, scrivi un commento.

Inizio Pagina