Successivo: , Precedente: , Su: Esempi   [Contenuti][Indice]


4.3 Rinominare file in minuscolo

Questo è un uso di sed alquanto strano. Si trasforma il testo, e lo si trasforma in modo che diventi un comando di shell, che poi si dà in pasto alla shell. Niente paura, con sed si è fatto anche di peggio; ho visto uno script che converte l’output di date in un programma bc!

La parte principale di questo è lo script sed, che rimappa il nome da minuscolo a maiuscolo (o viceversa) e controlla anche se il nome rimappato è lo stesso di quello originale. Si noti come lo script è parametrizzato usando variabili di shell e le opportune quotature.

#! /bin/sh
# rinomina file in minuscolo/maiuscolo... 
#
# uso: 
#    move-to-lower * 
#    move-to-upper * 
# o
#    move-to-lower -R .
#    move-to-upper -R .
#
help()
{
        cat << eof
Uso: $0 [-n] [-r] [-h] file...
-n      non esegue azioni, mostra solo ciò che verrebbe fatto
-R      ricorsivo (usa find)
-h      questo messaggio
files   i file da rimappare in minuscolo
Esempi:
       $0 -n *        (vede se tutto è a posto, quindi...)
       $0 *
       $0 -R .

eof
}
apply_cmd='sh'
finder='echo "$@" | tr " " "\n"'
files_only=
while :
do
    case "$1" in 
        -n) apply_cmd='cat' ;;
        -R) finder='find "$@" -type f';;
        -h) help ; exit 1 ;;
        *) break ;;
    esac
    shift
done
if [ -z "$1" ]; then
        echo Usage: $0 [-h] [-n] [-r] files...
        exit 1
fi
LOWER='abcdefghijklmnopqrstuvwxyz'
UPPER='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
case `basename $0` in
        *upper*) TO=$UPPER; FROM=$LOWER ;;
        *)       FROM=$UPPER; TO=$LOWER ;;
esac
eval $finder | sed -n '

# rimuove tutte le barre oblique iniziali
s/\/*$//
# aggiunge ./ se non ci sono percorsi, ma solo un nome di file
/\//! s/^/.\//
# salva percorso+nome_file
h
# rimuove il percorso
s/.*\///
# fa la conversione solo sul nome di file
y/'$FROM'/'$TO'/
# ora la riga contiene il percorso+file originale, mentre
# l'hold space contiene il nuovo nome di file
x
# aggiunge il nome di file convertito alla riga, che ora contiene
# percorso/nome-file\nome-file-convertito
G
# controlla se il nome di file convertito è uguale all'originale,
# se così è, non stampa niente
/^.*\/\(.*\)\n\1/b
# protegge i caratteri speciali per la shell
s/["$`\\]/\\&/g
# ora, trasforma percorso/da-file\n, in
# mv percorso/da-file percorso/a-file e lo stampa
s/^\(.*\/\)\(.*\)\n\(.*\)$/mv "\1\2" "\1\3"/p
' | $apply_cmd

Successivo: , Precedente: , Su: Esempi   [Contenuti][Indice]