Forum Informatica Unict

Vecchi ordinamenti ad esaurimento => Lab. Amministrazione di Sistemi => Topic started by: esteta84 on 04-03-2011, 08:42:46



Title: Esercizio script bash
Post by: esteta84 on 04-03-2011, 08:42:46
Ciao ragazzi, come risolvereste questo script?

Creare uno script di shell che opera su due parametri della riga di comando, ovvero: $1 il nome di una directory e $2 il nome di un'altra directory.
Ognuno dei file x contenuti nella directory $1 deve essere controllato con il comando file, per stabilire se si tratta di un file "ASCII text".
In caso affermativo, se x ha data di modifica più recente della directory $2, va copiato in essa, convertendo in maiuscolo tutti i caratteri in esso #contenuti.
Per la conversione minuscolo-maiuscolo si utilizzi il comando tr.


Title: Re:Esercizio script bash
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 04-03-2011, 09:18:06
oldPwd=$(pwd)
cd $1
for x in *
do file $x | grep "ASCII text" > /dev/null 2> /dev/null && [ $x -nt $2 ] && cat $x | tr '[:lower:]' '[:upper:]' > $2\$x
done
cd $oldPwd


Title: Re:Esercizio script bash
Post by: androidiano on 05-03-2011, 10:00:19
oldPwd=$(pwd)
cd $1
for x in *
do file $x | grep "ASCII text" > /dev/null 2> /dev/null && [ $x -nt $2 ] && cat $x | tr '[:lower:]' '[:upper:]' > $2\$x
done
cd $oldPwd
Credo ci siano due piccoli errori in questa soluzione:
1) Se $2 è un path relativo il codice nel DO non funziona più
2) Nell'ultima redirezione dell'output la barra \ è al contrario (dovrebbe essere / )

Questo dovrebbe correggere i due problemi:
#!/bin/sh
for x in `ls $1 -1`
do file $1/$x | grep "ASCII text" > /dev/null 2> /dev/null && [ $1/$x -nt $2 ] && cat $1/$x | tr '[:lower:]' '[:upper:]' > $2/$x
done


Title: Re:Esercizio script bash
Post by: esteta84 on 05-03-2011, 12:04:59
Io l'ho fatto così, che è molto simile alla vostra soluzione:

Code:
fileD1=`ls $1`

for varD1 in $fileD1
do

if (file $1/$varD1 | grep "ASCII text" >/dev/null) && (test $1/$varD1 -nt $2)
then
echo "vero"
cat $1/$varD1 | tr '[:lower:]''[:upper:]' | >$2/$varD1

fi
done


ma quando lo eseguo mi da questo errore:

tr: manca l'operando dopo "[:lower:][:upper:]"
Devono essere fornite due stringhe durante la traduzione.
Usare «tr --help» per ulteriori informazioni.

Il man non è tanto chiaro sull'uso di tr con i rispettivi parametri  :-)|


Title: Re:Esercizio script bash
Post by: androidiano on 05-03-2011, 12:11:11
Semplicemente manca uno spazio tra [:lower:] e [:upper:]
Ma invece il | alla fine di tr prima della redirezione che scopo ha?


Title: Re:Esercizio script bash
Post by: esteta84 on 05-03-2011, 12:25:44
scusa ho riletto bene stavo per dire una fesseria... ora provo


Title: Re:Esercizio script bash
Post by: esteta84 on 05-03-2011, 12:32:37
ok ho provato, funziona.
Il pipe lo avevo messo per dare in pasto l'output dei precedenti comandi al redirect ma, se lo metto, copia una stringa vuota nel file di destinazione. Quindi hai doppiamente ragione

Grazie 1000


Title: Re:Esercizio script bash
Post by: androidiano on 05-03-2011, 18:22:01
Di nulla. Con i pipe dai in pasto l'output del primo comando al secondo comando come input; nella redirezione non c'è questa necessità: ti serve solo che l'ultimo output vada rediretto su file, quindi non usi il pipe ma l'operatore di redirezione dello standard output >