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 su standard optput. VERSIONE CON VARIABILE ESPORTATA E VALORE DI RITORNO #!/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 # definizione variabile contaDir contaDir=0 export contaDir # invocazione della parte ricorsiva cerca070203 $* # calcolo dei direttori creati echo Sono stati creati $? direttori $2 #!/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 # incrementiamo la variabile contaDir contaDir=`expr $contaDir + 1` fi fi # ricerca ricorsiva for i in * do if test -d $i -a -x $i then $0 `pwd`/$i $2 contaDir=$? fi done exit $contaDir