jump to navigation

Io odio gli spazi!! 11 novembre 2007

Posted by fripp in Bash, Informatica, Scripting.
Tags: ,
trackback

Non so cosa ne pensiate, ma secondo me nulla è più irritante di trovare file il cui nome contiene degli spazi quando si scrive dalla riga di comando. Per ovviare a questo mio spiacevole problema Santa Bash (sempre sia benedetta!) mi è venuta in soccorso.

Ecco uno scriptino, che in pochissime righe, elimina tutti i fastidiosissimi spazi di tutti i files contenuti nella directory passata come argomento. Lo script non fa alcun controllo sui permessi per effettuare tale ridenominazione.

Ecco il codice


#!/bin/sh
#Questo script legge tutti i file della directory passata come argomento e sostituisce tutti gli spazi con _

#Assegnamo alla variabile directory l'argomento dello script

if [[ $# -ne 1 ]]; then
    name=`basename $0`
    echo "usage: $name dirname"
    exit 1
fi

if [[ ! -d $1 ]]; then
    echo "$1 is not a directory"
    exit 1
fi

directory=$1

find $1 -maxdepth 1 -print0 |\
    xargs -0 -n1 bash -c \
     'newname=${0// /_};if [ ! -e $newname ];then eval mv \"$0\" $newname;fi;'

#Descrizione del comando:
#Nella riga 9 in comando find cerca tutti i file della directory
#corrente e li restituisce separati dal carattere
#(quest'operazione viene specificare dall'opzione -print0)
#L'output della riga 9 viene passato i input al comando xargs
#della riga 10 che tokenizza la stringa che riceve in input
#in corrispondenza di ogni carattere .
#A sua volta xargs richiama l'interprete bash affinchè esegua
#la porzione di codice racchiusa dagli apici
#Attraverso l'espressione ${0// /_}sostituiamo a tutti gli
#spazi di $0 il carattere _.
#Viene poi verificato che nella directory corrente non
#esistano altri file che si chiamano newname.
#Se la condizioen è verificata il file $0 viene
#rinominato in newname

Il file sorgente si trova qui.

Annunci

Commenti»

1. dreamer - 12 novembre 2007

Per chi volesse utilizzare lo stesso script senza i comandi ‘find’ e ‘xargs’, può vedere quest’altra versione:
#!/bin/bash

insert_name(){
echo “name $newname exists….insert another: ”
read name
if [ ! -e “$1/$name” ] #se non esiste
then
mv $1/$2 $1/$name
return 0
else
insert_name $1 $2
return 0
fi
}

if [ “$#” -gt 1 ]; then
echo “usage:$0 [dir_name]”
echo “Insert the absolute path of dir_name without the last slash ‘/'”
exit 1
elif [ “$#” -eq 1 ];then
DIR=$1
else
DIR=$PWD
fi

if [ ! -d $DIR ]; then
echo “$DIR is not a directory”
exit 1
fi

FILES=$(ls $DIR)
OLD_IFS=$IFS
IFS=’

for file in $FILES
do
if [ ! -z “`echo $file | egrep ‘\ ‘`” ] #ci sono nomi con gli spazi
then
newname=${file// /_}
if [ ! -e “$newname” ] #se non esiste
then
mv $file $newname
else
insert_name $DIR $file
fi
fi
done
exit 1

2. fripp - 13 novembre 2007

Per chi non lo sapesse, la variabile IFS usata da dreamer nel suo script è una variabile d’ambiente della shell bash e contiene separatori di campi (Input Field Separator); in genere è inizializzata con spaziature (spazi, tabulature, ecc…..), ma può esser inizializzato nella maniera che si ritiene più opportuna ai propri scopi


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: