Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- La parte in Shell deve prevedere tre parametri: il primo deve essere il nome assoluto di un direttorio che
- identifica una gerarchia (G) all’interno del file system, il secondo parametro deve essere il nome relativo
- semplice di un file (F), mentre il terzo parametro deve essere considerato un numero intero positivo (N). Il
- comportamento atteso dal programma, dopo il controllo dei parametri, è organizzato in generale in tre fasi (Fasi
- A, B e C).
- Il programma deve cercare nella gerarchia G specificata (inclusa la radice) - tramite un file comandi ricorsivo,
- FCR - tutti i direttori che contengono un file che ha nome relativo F: si riporti il nome assoluto di tali direttori
- sullo standard output e si contino globalmente i file che soddisfano la condizione indicata (Fase A).
- Al termine dell’intera esplorazione ricorsiva di G, si deve riportare sullo standard output il numero totale di file
- (NF) che soddisfano la condizione indicata. In caso NF sia minore di N, il programma passa alla Fase B: si deve
- reinvocare FCR in modo da cercare nella gerarchia G specificata (inclusa la radice) tutti i direttori che NON
- contengono un file con nome relativo F, riportando sullo standard output il nome assoluto dei direttori trovati e
- creando un file vuoto con nome relativo F all'interno di ognuno.
- Quindi, se è stato necessario eseguire la Fase B, si deve passare alla Fase C in cui si deve verificare la situazione
- risultante invocando nuovamente FCR come per la Fase A.
- NOTA BENE: FCR dovrà prevedere un parametro ulteriore rispetto a G, F e N per differenziare l'esecuzione
- delle diverse Fasi.
- #! /bin/sh
- #Controllo che ci siano esattamente 3 parametri
- case $# in
- 3);;
- *) echo "Numero sbagliato di parametri: ci vogliono 3 parametri (nome ass dir, nome relativo file da cercare e numero intero positivo"
- exit 1;;
- esac
- G=$1
- F=$2
- N=$3
- #Controllo che sia il nome assoluto di direttorio
- case $G in
- /*);;
- *) echo "$G non e' in forma assoluta"
- exit 2;;
- esac
- #Controllo che sia un direttorio esplorabile
- if test ! -d $G -o ! -x $G
- then
- echo "$G non e' un direttorio o non e' esplorabile"
- exit 3
- fi
- #Controllo che F sia un nome relativo
- case $F in
- */*) echo "$F non e' in forma relativa"
- exit 4;;
- *);;
- esac
- #Controllo che sia un numero > 0
- test $N -gt 0 1>/dev/null 2>/dev/null
- case $? in
- 0);;
- *) echo "$N non e' una stringa o non e' strettamente > 0"
- exit 5;;
- esac
- PATH=`pwd`:$PATH
- export PATH
- #creaiamo un file temporaneo che serve solo per riportare le cose poi alla situazione precedente: non richiesto dalla soluzione
- > /tmp/perPulisci
- #Fase A
- #usiamo un file temporaneo che passeremo come ultimo parametro
- > /tmp/esame$$
- FCR.sh $G $F A /tmp/esame$$
- #conto il numero di righe sul file temporaneo=numero di file trovati
- NF=`wc -l < /tmp/esame$$`
- echo "File trovati fase A: $NF"
- #Se il numero file < N eseguo la fase B e C
- if test $NF -lt $N
- then
- FCR.sh $G $F B #nella fase B il file temporaneo non serve e quindi possiamo non passarlo!
- > /tmp/esame$$ #azzeriamo il file temporaneo
- FCR.sh $G $F C /tmp/esame$$
- #Riconto il numero di righe per controllare il numero dei file
- NF=`wc -l < /tmp/esame$$`
- echo "File trovati fase C: $NF"
- fi
- #da ultimo cancelliamo il file temporaneo
- rm /tmp/esame$$
- -------------------------------------------------------------------------------------------------------------------------------
- #! /bin/sh
- cd $1
- #se il terzo parametro: flag=A o C
- #cerco i file che si chiamano F e se ne trovo uno scrivo il nome assoluto del direttorio
- #nome assoluto del file trovato su un file temporaneo
- if test "$3" = A -o "$3" = C
- then
- #echo fase $3
- if test -f $2
- then
- echo "Trovato $2 in `pwd`"
- echo "`pwd`/$i" >> $4
- fi
- fi
- #se il terzo parametro e' uguale a B invoco la seconda fase
- #dove cerco i direttori in cui non ci sono file che si chiamano F
- if test "$3" = B
- then
- #echo fase $3
- trovato=0
- if test -f $2
- then
- trovato=1
- fi
- #se non trovo un file scrivo il nome del direttorio sullo stdout
- if test $trovato -eq 0
- then
- echo "In `pwd` non c'e' un file che si chiama $2 e quindi lo creo"
- > $2
- echo "`pwd`/$2" >> /tmp/perPulisci
- fi
- fi
- #se trovo un direttorio esplorabile
- #richiamo la ricorsione con il terzo parametro come flag
- for i in *
- do
- if test -d $i -a -x $i
- then
- #echo ricorsione
- FCR.sh `pwd`/$i $2 $3 $4 #nella fase B $4 sara' nulllo
- fi
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement