Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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