SISTEMI OPERATIVI ESERCIZIO del 7 FEBBRAIO 2003 (Prova in itinere) La parte in Shell deve prevedere due parametri: il primo deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all'interno del file system; mentre il secondo deve essere il nome relativo (semplice) di un direttorio (D). Il programma deve cercare nella gerarchia G specificata tutti i direttori che contengono un numero di file (solo file e non direttori) multiplo intero di 5 e che contengono almeno un file (solo file e non direttorio) il cui nome contiene il carattere 'L': si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato, si deve creare un direttorio di nome D verificando che esso non esista già. La parte in Shell deve calcolare il numero totale di direttori dove è stato possibile creare il direttorio di nome D e stamparlo sullo standard output. #!/bin/sh # file es070203 # soluzione del compito del 7 febbraio 2003 SONOD # parte principale shell # controllo del numero dei parametri case $# in 2) ;; *) echo Uso: $0 dirassoluto dirrelativo exit ;; esac # controllo sul primo parametro case $1 in /*) if test ! -d $1 -o ! -x $1 then echo $1 non esiste o non eseguibile exit fi ;; *) echo $1 non e"'" assoluto exit ;; esac # controllo sul secondo parametro case $2 in */*) echo $2 non e"'" relativo exit ;; esac # impostazione della variabile PATH PATH=`pwd`:$PATH export PATH # creazione di un file temporaneo > /tmp/contadir$$ # invocazione della parte ricorsiva cerca070203 $* /tmp/contadir$$ # cacolo dei direttori creati echo Sono stati creati `cat /tmp/contadir$$ | wc -l` direttori $2 # cancellazione del file temporaneo rm /tmp/contadir$$ #!/bin/sh # file cerca070203 # soluzione del compito del 7 febbraio 2003 SONOD # parte ricorsiva shell cd $1 # variabile per contare il numero di file nel direttorio conta=0 # variabile per controllare la presenza di un file # con il carattere 'L' nel nome presente=false for i in * do # se e' un file if test -f $i then # incrementa conta conta=`expr $conta + 1` # se contiene 'L' nel nome case $i in *L*) presente=true ;; esac fi done # se il numero di file e' multiplo di 5 e almeno uno ha 'L' nel nome tmp=`expr $conta % 5` if test $tmp -eq 0 -a $presente = true then # stampa del nome assoluto echo trovato direttorio `pwd` # se non esiste il direttorio $2 if test ! -d $2 then # lo creiamo mkdir $2 # aggiungiamo una linea nel file temporaneo echo `pwd`/$2 >> $3 fi fi # ricerca ricorsiva for i in * do if test -d $i -a -x $i then $0 $i $2 $3 fi done 7 febbraio 2003 SONOD 1