Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- La parte in Shell deve prevedere un numero variabile di parametri N+1 (N maggiore o uguale a 2): i
- primi N parametri devono essere nomi assoluti di direttori che identificano N gerarchie (G1, G2, …)
- all’interno del file system, mentre l’ultimo parametro deve essere considerato un numero intero X
- strettamente positivo. Il comportamento atteso dal programma, dopo il controllo dei parametri, è
- organizzato in N fasi, una per ogni gerarchia.
- Il programma, per ognuna delle N fasi, deve esplorare la gerarchia Gi corrispondente - tramite un file
- comandi ricorsivo, FCR.sh - e devono contare globalmente tutti i direttori che soddisfano le seguenti
- due specifiche: 1) devono contenere solo file (e non sotto-directory) e 2) devono contenere solo file la
- cui lunghezza in linee sia strettamente maggiore di X. Al termine di tutte le N fasi, si deve riportare
- sullo standard output il numero totale di direttori trovati globalmente che soddisfano la specifica
- precedente (direttori trovati). Inoltre, per ogni direttorio trovato, si deve riportare sullo standard output
- il suo nome assoluto, e quindi per ognuno dei file (file corrente) in esso contenuto deve essere
- riportato sullo standard output il suo nome assoluto e contestualmente la linea X-esima del file
- corrente a partire dalla fine del file.
- #!/bin/sh
- #Soluzione della Prima Prova in itinere del 15 Aprile 2016
- #versione che usa un file temporaneo e usa FCR.sh per tutte le fasi
- case $# in
- 0|1|2|3) echo Errore: numero parametri is $# quindi pochi parametri. Usage is $0 numero dirass1 dirass2 ...
- exit 1;;
- *) echo OK: da qui in poi proseguiamo con $# parametri ;;
- esac
- #dobbiamo isolare l'ultimo parametro e intanto facciamo i controlli
- num=1 #la variabile num ci serve per capire quando abbiamo trovato l'ultimo parametro
- params= #la variabile params ci serve per accumulare i parametri a parte l'ultimo
- #in $* abbiamo i nomi delle gerarchie e il numero intero
- for i
- do
- if test $num -ne $# #ci serve per non considerare l'ultimo parametro che e' il numero
- then
- params="$params $i"
- #soliti controlli su nome assoluto e direttorio traversabile
- case $i in
- /*) if test ! -d $i -o ! -x $i
- then
- echo $i non direttorio
- exit 2
- fi;;
- *) echo $i non nome assoluto; exit 3;;
- esac
- else
- #abbiamo individuato l'ultimo parametro e quindi facciamo il solito controllo su numerico e strettamente positivo
- X=$i #salviamo l'ultimo parametro
- #Controllo ultimo parametro
- expr $X + 0 > /dev/null 2>&1
- N1=$?
- if test $N1 -ne 2 -a $N1 -ne 3
- then #echo numerico $1 siamo sicuri che numerico
- if test $X -le 0
- then echo $X non strettamente positivo
- exit 4
- fi
- else
- echo $X non numerico
- exit 5
- fi
- fi
- num=`expr $num + 1` #incrementiamo il contatore del ciclo sui parametri
- done
- #controlli sui parametri finiti possiamo passare alle N fasi
- PATH=`pwd`:$PATH
- export PATH
- > /tmp/conta$$ #creiamo/azzeriamo il file temporaneo. NOTA BENE: SOLO 1 file temporaneo!
- for i in $params
- do
- echo fase per $i
- #invochiamo il file comandi ricorsivo con la gerarchia, il numero e il file temporaneo
- FCR.sh $i $X /tmp/conta$$
- done
- #terminate tutte le ricerche ricorsive cioe' le N fasi
- #N.B. Andiamo a contare le linee del file /tmp/conta$$
- D=`wc -l < /tmp/conta$$`
- echo Il numero di directory totali che soddisfano la specifica = $D
- for i in `cat /tmp/conta$$`
- do
- #Stampiamo (come richiesto dal testo) i nomi assoluti delle directory trovate
- echo "Trovato il direttorio $i; contiene i seguenti file:"
- cd $i
- for file in * #siamo sicuri che sono solo file (controllo fatto da FCR.sh)
- do
- echo "file: $file"
- echo "la cui linea $X-esima a partire dalla fine e' la seguente:"
- #selezioniamo direttamente la $X-esima linea del file corrente a partire dalla fine
- tail -$X $file | head -1
- done
- done
- #da ultimo eliminiamo il file temporaneo
- rm /tmp/conta$$
- --------------------------------------------------------------------------------------------------
- #!/bin/sh
- #FCR.sh
- #file comandi ricorsivo che scrive il nome dei direttori trovati sul file temporaneo
- #il cui nome e' passato come terzo argomento
- cd $1
- #la variabile NR ci serve per il numero di linee dei file
- NR=0
- #la variabile DIR ci serve per capire se ci sono solo file
- DIR=false
- #la variabile trovato ci serve per capire se tutti i file rispettano la specifica
- trovato=true
- for i in *
- do
- #controlliamo solo i nomi dei file (se inseriamo anche il controllo se leggibili per cautelarci dato che dopo usiamo il comando wc bisogna commentarlo!)
- if test -f $i
- then
- #calcoliamo il numero di linee
- NR=`wc -l < $i`
- #controlliamo se il numero delle linee NON e' strettamente maggiore di X
- if test $NR -le $2
- then
- #abbiamo trovato un file che NON soddisfa le specifiche e quindi mettiamo a false trovato
- trovato=false
- fi
- else
- if test -d $i
- then
- #abbiamo trovato un direttorio e quindi dobbiamo mettere a true DIR
- DIR=true
- fi
- fi
- done
- #se i due booleani sono rimasti ai valori iniziali allora abbiamo trovato un direttorio giusto. Nota bene: l'ultimo controllo garantisce che si sia trovato almeno un file
- if test $DIR = false -a $trovato = true -a $NR -ne 0
- then
- pwd >> $3
- fi
- for i in *
- do
- if test -d $i -a -x $i
- then
- #chiamata ricorsiva cui passiamo come primo parametro il nome assoluto del direttorio
- FCR.sh `pwd`/$i $2 $3
- fi
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement