• Non ci sono risultati.

Lab. di Sistemi Operativi Esercitazioni proposte per la lezione del 30 marzo 2012

N/A
N/A
Protected

Academic year: 2021

Condividi "Lab. di Sistemi Operativi Esercitazioni proposte per la lezione del 30 marzo 2012"

Copied!
18
0
0

Testo completo

(1)

Lab. di Sistemi Operativi

Esercitazioni proposte per la lezione del 30 marzo 2012

Utilizzando la shell di Linux e disponendosi in gruppi di due persone per ogni PC del laboratorio.

1. es51p.sh Controllo parametri del seguente quesito: La parte in Shell prevede un parametro che deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system. Il programma deve determinare il livello corrente di profondit`a raggiunto in ogni invocazione ricorsiva e riportare sullo standard output il massimo livello della gerarchia compresa la radice della gerarchia G.

2. (15 minuti) es51r.sh Ricerca ricorsiva del quesito della precedente domanda

3. (10 minuti) es52p.sh Controllo parametri del seguente quesito: La parte in Shell prevede 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 parametro deve essere un nome relativo semplice (D). Il programma deve cercare nella gerarchia G specificata (tramite un file comandi ricorsivo, FCR) tutti i direttori che hanno nome relativo D ad esclusione della radice: si riporti il nome assoluto di tali direttori sullo standard output (Fase A). Al termine dell’intera esplorazione ricorsiva di G, si deve chiedere all’utente se re-invocare il file comandi ricorsivo FCR per creare un direttorio con nome relativo D in tutti i direttori in cui chiaramente non esiste (Fase B). Quindi si deve verificare la situazione risultante invocando nuovamente FCR (Fase A).

4. (15 minuti) es52r.sh Ricerca ricorsiva del quesito della precedente domanda

5. (10 minuti) es53p.sh Controllo parametri della parte shell del compito del 17 luglio 2007: 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, mentre il secondo parametro e il terzo parametro devono essere considerati singoli caratteri numerici Cx e Cy. Il programma deve cercare nella gerarchia G specificata (compresa la radice) tutti i direttori che contengono almeno un file che contiene sia nel nome che nel contenuto entrambi i caratteri Cx e Cy. Si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato, si deve invocare la parte in C, passando come parametri i nomi dei file trovati (F0... FN-1) e i caratteri numerici Cx e Cy.

6. (15 minuti) es53r.sh Ricerca ricorsiva della parte shell del compito del 17 luglio 2007

7. (10 minuti) es54p.sh Controllo parametri della parte shell del compito del 3 aprile 2009: La parte in Shell deve prevedere due parametri: il primo parametro deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system, mentre il secondo parametro deve essere considerato un numero intero strettamente positivo (K). Il programma deve cercare nella gerarchia G specificata tutti i direttori (compresa la radice) che contengono un numero di file (solo file e non direttori) compreso fra 1 e K (estremi inclusi): si riporti il nome assoluto dell’ultimo file trovato (Fi) sullo standard output. Al termine dell’intera esplorazione ricorsiva di G, si deve invocare la parte C passando come parametri tutti i nomi assoluti dei file Fi trovati.

8. (15 minuti) es54r.sh Ricerca ricorsiva della parte shell del compito del 3 aprile 2009

9. (10 minuti) es55p.sh Controllo parametri della parte shell del compito del 6 febbraio 2009 : 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 deve essere il nome relativo semplice di un direttorio (D), mentre il terzo parametro deve essere considerato un numero intero (N) strettamente positivo. Il programma deve cercare nella gerarchia G specificata tutti i direttori di nome D che contengono file (F) che hanno dimensione in byte strettamente maggiore di N: si riporti il nome assoluto di tali direttori sullo standard output e si contino globalmente i file F che soddisfano la condizione precedente. In ogni direttorio trovato, si deve creare un file di nome SOMMA avente come

(2)

contenuto la concatenazione di tutti i file F del direttorio che soddisfano la condizione precedente. La parte in Shell, dopo aver calcolato nella gerarchia G il numero totale di file che soddisfano la condizione indicata, lo deve stampare sullo standard output.

10. (15 minuti) es55r.sh Ricerca ricorsiva della parte shell del compito del 6 febbraio 2009

11. (10 minuti) es56p.sh Controllo parametri della parte shell del compito del 16 settembre 2008 : La parte in Shell deve prevedere due parametri: il primo parametro deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system e il secondo parametro deve essere una stringa (F). Il programma deve cercare nella gerarchia G specificata tutti i direttori (compresa la radice) che contengono, fra gli altri, 2 file i cui nomi sono uguali a F.1 e F.2 e la cui lunghezza in linee e in caratteri deve essere la stessa: si riporti il nome assoluto di tali direttori sullo standard output.

Per ogni direttorio che soddisfa la condizione precedente, si deve invocare la parte C passando i due file trovati F.1 e F.2 come parametri.

12. (15 minuti) es56r.sh Ricerca ricorsiva della parte shell del compito del 16 settembre 2008

13. (10 minuti) es57p.sh Controllo parametri della parte shell del compito del 10 febbraio 2006 : 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 (compresa la radice) tutti i direttori che hanno nome D e che contengono un numero di file pari al numero di sotto-direttori pi`u 2: si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato, si deve creare un numero di sotto-direttori in modo che venga pareggiato il numero di file e sotto-direttori: i nomi dei sotto-direttori da creare devono essere chiesti interattivamente all’utente.

La parte in Shell deve calcolare il numero totale di sotto-direttori effettivamente creati nella gerarchia G e stamparlo sullo standard output.

14. (15 minuti) es57r.sh Ricerca ricorsiva della parte shell del compito del 10 febbraio 2006

15. (10 minuti) es58p.sh Controllo parametri della parte shell del compito del 26 giugno 2007 : La parte in Shell deve prevedere un numero variabile N+1 di parametri: il primo deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system; mentre gli altri N parametri devono essere considerati singoli caratteri C1, C2, . . . CN. Il programma deve cercare nella gerarchia G specificata tutti i file che siano di dimensione pari e che contengono (nel contenuto) tutti i caratteri Ci. Si riporti il nome assoluto di tali file sullo standard output. Per ogni file trovato F, si deve invocare la parte in C, passando come parametri F e i caratteri C1, C2, . . . CN.

16. (15 minuti) es58r.sh Ricerca ricorsiva della parte shell del compito del 26 giugno 2007

17. (10 minuti) es59p.sh Controllo parametri della parte shell del compito del 17 giugno 2008 : La parte in Shell deve prevedere 2 parametri: il primo deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system, mentre il secondo parametro deve essere considerato un numero intero strettamente positivo (K). Il programma deve cercare nella gerarchia G specificata tutti i direttori che contengono file che abbiano numero di linee uguale a K. Si riporti il nome assoluto di tali direttori sullo standard output. In ognuno di tali direttori trovati, per ogni file Fi trovato (F1, F2, . . . FN) che soddisfa la condizione precedente si deve produrre un ordinamento delle linee secondo il normale ordine alfabetico ridirigendo il risultato su un file di nome Fi.sort. Quindi, sempre in ogni direttorio trovato, si deve invocare la parte in C, passando come parametri i nomi dei file generati (F1.sort, F2.sort, . . . FN.sort).

18. (15 minuti) es59r.sh Ricerca ricorsiva della parte shell del compito del 17 giugno 2008

(3)

Soluzione

Esercitazioni proposte per la lezione del 30 marzo 2012

Utilizzando la shell di Linux e disponendosi in gruppi di due persone per ogni PC del laboratorio.

1. es51p.sh Controllo parametri del seguente quesito: La parte in Shell prevede un parametro che deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system. Il programma deve determinare il livello corrente di profondit`a raggiunto in ogni invocazione ricorsiva e riportare sullo standard output il massimo livello della gerarchia compresa la radice della gerarchia G.

Soluzione:

#! / b i n / s h

# S o l u z i o n e q u e s i t o e s 5 1 − p r i n c i p a l e

# D a t i : $1−>G

# C o n t r o l l o a r g o m e n t i =1=

case $# i n 1 ) ; ;

∗ ) echo Uso : $0 G; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# I n v o c a z i o n e d e l l a p a r t e r i c o r s i v a con argomento a g g i u n t i v o

# c h e i n d i c a i l l i v e l l o c o r r e n t e e s 5 1 r . sh $G 0

# Stampa massimo l i v e l l o o t t e n u t o come e x i t v a l u e s u p p o s t o minore d i 255 echo ” V a l o r e massimo r a g g i u n t o : $ ? ”

2. (15 minuti) es51r.sh Ricerca ricorsiva del quesito della precedente domanda Soluzione:

#! / b i n / s h

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−> l i v e l l o c o r r e n t e l i v e l l o c o r r e n t e =‘expr $2 + 1 ‘

cd $1

echo ”mi t r o v o i n ‘ pwd ‘ a l i v e l l o $ l i v e l l o c o r r e n t e ”

# I n v o c a z i o n e r i c o r s i v a

l i v e l l o m a s s i m o=$ l i v e l l o c o r r e n t e f o r f i l e n a m e i n ∗

do

(4)

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $ l i v e l l o c o r r e n t e r i t o r n o=$ ?

i f [ $ r i t o r n o −g t $ l i v e l l o m a s s i m o ] then

l i v e l l o m a s s i m o=$ r i t o r n o f i

f i done

e x i t $ l i v e l l o m a s s i m o

3. (10 minuti) es52p.sh Controllo parametri del seguente quesito: La parte in Shell prevede 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 parametro deve essere un nome relativo semplice (D). Il programma deve cercare nella gerarchia G specificata (tramite un file comandi ricorsivo, FCR) tutti i direttori che hanno nome relativo D ad esclusione della radice: si riporti il nome assoluto di tali direttori sullo standard output (Fase A). Al termine dell’intera esplorazione ricorsiva di G, si deve chiedere all’utente se re-invocare il file comandi ricorsivo FCR per creare un direttorio con nome relativo D in tutti i direttori in cui chiaramente non esiste (Fase B). Quindi si deve verificare la situazione risultante invocando nuovamente FCR (Fase A).

Soluzione:

#! / b i n / s h

# S o l u z i o n e q u e s i t o e s 5 2 − p r i n c i p a l e

# D a t i : $1−>G $2−>D

# C o n t r o l l o a r g o m e n t i =2=

case $# i n 2 ) ; ;

∗ ) echo Uso : $0 G D; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

D=” $2 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o D nome r e l a t i v o s e m p l i c e case ”$D” i n

/ ∗ ) echo D non r e l a t i v o ; e x i t 1 ; ;

∗ / ∗ ) echo D non s e m p l i c e ; e x i t 1 ; ;

∗ ) ; ; # Ok , non c o n t i e n e / e s a c

# ATTN: non c o n t r o l l a r e c h e D e s i s t a n e l l a d i r c o r r e n t e !

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

(5)

export PATH

# Prima i n v o c a z i o n e FCR f a s e A e s 5 2 r . sh $G $D A

# Seconda i n v o c a z i o n e f a s e B, su r i c h i e s t a echo −n ” Eseguo f a s e B? ”

read a z i o n e case $ a z i o n e i n

S | s ) ; ;

N| n ) e x i t 0 ; ; e s a c

e s 5 2 r . sh $G $D B

# Terza i n v o c a z i o n e come p e r f a s e A e s 5 2 r . sh $G $D A

4. (15 minuti) es52r.sh Ricerca ricorsiva del quesito della precedente domanda Soluzione:

#! / b i n / s h

# R i c e r c a (FCR)

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>D, $3−>FASE cd $1

D=” $2 ” FASE=$3

# R i c e r c a d i r e c t o r y con nome r e l a t i v o D ( e s c l u s a r a d i c e ) i f [ −d ”$D” ]

then

i f [ $FASE = A ] then

echo ‘pwd‘ / ”$D”

f i f i

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $D $FASE f i

done

# ATTN: i l t e s t o e ’ ambiguo : s e s i c r e a una d i r e c t o r y

# p o i s i d e v e e n t r a r e anche i n q u e s t a e l a c r e a z i o n e p r o c e d e

# s e n z a l i m i t e . Conviene e s e g u i r e l a c r e a z i o n e dopo l a r i c o r s i o n e

# i n modo c h e l e d i r e c t o r y p r e s e i n esame s i a n o s o l o q u e l l e e s i s t e n t i i f [ ! −e ”$D” ]

then

i f [ $FASE = B ] then

mkdir $D f i

f i

5. (10 minuti) es53p.sh Controllo parametri della parte shell del compito del 17 luglio 2007: 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, mentre il secondo parametro e il terzo parametro devono

(6)

essere considerati singoli caratteri numerici Cx e Cy. Il programma deve cercare nella gerarchia G specificata (compresa la radice) tutti i direttori che contengono almeno un file che contiene sia nel nome che nel contenuto entrambi i caratteri Cx e Cy. Si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato, si deve invocare la parte in C, passando come parametri i nomi dei file trovati (F0... FN-1) e i caratteri numerici Cx e Cy.

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 17 l u g l i o 2007 − p r i n c i p a l e

# D a t i : $1−>G $2−>Cx $3−>Cy

# C o n t r o l l o a r g o m e n t i =3=

case $# i n 3 ) ; ;

∗ ) echo Uso : $0 G Cx Cy ; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

Cx=” $2 ” Cy=” $3 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o Cx s i n g o l o c a r a t t e r e numerico case ”$Cx” i n

[ 0 − 9 ] ) ; ;

∗ ) echo Cx non s i n g o l o c a r . num . ”$Cx” ; e x i t 1 ; ; e s a c

# C o n t r o l l o Cy s i n g o l o c a r a t t e r e numerico case ”$Cy” i n

[ 0 − 9 ] ) ; ;

∗ ) echo Cy non s i n g o l o c a r . num . ”$Cy” ; e x i t 1 ; ; e s a c

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# I n i z i o r i c e r c a e s 5 3 r . sh $G $Cx $Cy

6. (15 minuti) es53r.sh Ricerca ricorsiva della parte shell del compito del 17 luglio 2007 Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 17 l u g l i o 2007 − r i c e r c a

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>Cx , $3−>Cy cd $1

Cx=$2

(7)

Cy=$3

# R i c e r c a d i r e c t o r y c h e s o d d i s f a n o l a r i c h i e s t a s o d d i s f a =0

l i s t a =” ”

f o r f i l e n a m e i n ∗ do

i f [ −f $ f i l e n a m e −a −r $ f i l e n a m e ] then

case $ f i l e n a m e i n

∗$Cx∗$Cy ∗ ) nomeok = 1 ; ;

∗$Cy∗$Cx ∗ ) nomeok = 1 ; ;

∗ ) nomeok = 0 ; ; e s a c

g r e p −q $Cx $ f i l e n a m e t r o v a t o C x=$ ?

g r e p −q $Cy $ f i l e n a m e t r o v a t o C y=$ ?

i f [ $nomeok −eq 1 −a $ t r o v a t o C x −eq 0 −a $ t r o v a t o C y −eq 0 ] then

s o d d i s f a =1

l i s t a =” $ l i s t a $ f i l e n a m e ” f i

f i done

# C o n t r o l l o su s o d d i s f a i f [ $ s o d d i s f a −eq 1 ] then

echo Trovata d i r e c t o r y ‘pwd‘

parteC $ l i s t a f i

# I n v o c a z i o n e r i c o r s i v a ( a t t e n z i o n e a g l i a r g o m e n t i ) f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $2 $3 f i

done

7. (10 minuti) es54p.sh Controllo parametri della parte shell del compito del 3 aprile 2009: La parte in Shell deve prevedere due parametri: il primo parametro deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system, mentre il secondo parametro deve essere considerato un numero intero strettamente positivo (K). Il programma deve cercare nella gerarchia G specificata tutti i direttori (compresa la radice) che contengono un numero di file (solo file e non direttori) compreso fra 1 e K (estremi inclusi): si riporti il nome assoluto dell’ultimo file trovato (Fi) sullo standard output. Al termine dell’intera esplorazione ricorsiva di G, si deve invocare la parte C passando come parametri tutti i nomi assoluti dei file Fi trovati.

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 3 a p r i l e 2009 − p r i n c i p a l e

# D a t i : $1−>G $2−>K

# C o n t r o l l o a r g o m e n t i ==2 case $# i n

(8)

2 ) ; ;

∗ ) echo Uso : $0 G K; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

K=” $2 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o K numerico

expr ”$K” + 0 > / dev / n u l l 2>&1 case $ ? i n

0 ) ; ; # r i s u l t a t o != 0 1 ) ; ; # r i s u l t a t o == 0

2 ) echo K non nu me ri c o : ”$K” ; e x i t 1 ; ; # s y n t a x e r r o r , e s . K=’+’

3 ) echo K non nu me ri c o : ”$K” ; e x i t 1 ; ; # non−numeric argument , e s . K=’a ’ e s a c

# C o n t r o l l o K s t r e t t a m e n t e p o s i t i v o i f [ $K − l e 0 ]

then

echo K non s t r e t t a m e n t e p o s i t i v o : ”$K”

e x i t 1 f i

# C o n t r o l l o K p a r i

i f [ ‘ expr $K % 2 ‘ −ne 0 ] then

echo K non p a r i : ”$K”

e x i t 1 f i

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# F i l e temporaneo p e r l a l i s t a d e i f i l e t r o v a t i f i l e t e m p =/tmp/ temp$$

> $ f i l e t e m p

# I n i z i o r i c e r c a

e s 5 4 r . sh $G $K $ f i l e t e m p

# I n v o c a z i o n e p a r t e C a l t e r m i n e d e l l ’ e s p l o r a z i o n e parteC ‘ cat $ f i l e t e m p ‘

rm $ f i l e t e m p

8. (15 minuti) es54r.sh Ricerca ricorsiva della parte shell del compito del 3 aprile 2009 Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 3 a p r i l e 2009 − r i c e r c a

(9)

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>K, $3−> f i l e temporaneo cd $1

# R i c e r c a d i r e c t o r y c h e s o d d i s f a n o l a r i c h i e s t a c o n t a f i l e =0

l i s t a =” ” u l t i m o f i l e=” ” f o r f i l e n a m e i n ∗ do

i f [ −f $ f i l e n a m e −a −r $ f i l e n a m e ] then

c o n t a f i l e =‘expr $ c o n t a f i l e + 1 ‘ l i s t a =” $ l i s t a ‘ pwd ‘ / $ f i l e n a m e ” u l t i m o f i l e=$ f i l e n a m e

f i done

# C o n t r o l l o su c o n t a f i l e

i f [ $ c o n t a f i l e −ge 1 −a $ c o n t a f i l e − l e $2 ] then

echo Ultimo f i l e ‘pwd‘ / $ u l t i m o f i l e echo $ l i s t a >> $3

f i

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $2 $3 f i

done

9. (10 minuti) es55p.sh Controllo parametri della parte shell del compito del 6 febbraio 2009 : 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 deve essere il nome relativo semplice di un direttorio (D), mentre il terzo parametro deve essere considerato un numero intero (N) strettamente positivo. Il programma deve cercare nella gerarchia G specificata tutti i direttori di nome D che contengono file (F) che hanno dimensione in byte strettamente maggiore di N: si riporti il nome assoluto di tali direttori sullo standard output e si contino globalmente i file F che soddisfano la condizione precedente. In ogni direttorio trovato, si deve creare un file di nome SOMMA avente come contenuto la concatenazione di tutti i file F del direttorio che soddisfano la condizione precedente. La parte in Shell, dopo aver calcolato nella gerarchia G il numero totale di file che soddisfano la condizione indicata, lo deve stampare sullo standard output.

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 6 f e b b r a i o 2009 − p r i n c i p a l e

# D a t i : $1−>G $2−>D $3−>N

# C o n t r o l l o a r g o m e n t i =3=

case $# i n 3 ) ; ;

∗ ) echo Uso : $0 G D N; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

D=” $2 ”

(10)

N=” $3 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o D nome r e l a t i v o s e m p l i c e case ”$D” i n

/ ∗ ) echo D non r e l a t i v o ; e x i t 1 ; ;

∗ / ∗ ) echo D non s e m p l i c e ; e x i t 1 ; ;

∗ ) ; ; # Ok , non c o n t i e n e / e s a c

# ATTN: non c o n t r o l l a r e c h e D e s i s t a n e l l a d i r c o r r e n t e !

# C o n t r o l l o N numerico

expr ”$N” + 0 > / dev / n u l l 2>&1 case $ ? i n

0 ) ; ; # r i s u l t a t o != 0 1 ) ; ; # r i s u l t a t o == 0

2 ) echo N non n um e ri co : ”$N” ; e x i t 1 ; ; # s y n t a x e r r o r , e s . N=’+’

3 ) echo N non n um e ri co : ”$N” ; e x i t 1 ; ; # non−numeric argument , e s . N=’a ’ e s a c

# C o n t r o l l o N s t r e t t a m e n t e p o s i t i v o i f [ $N − l e 0 ]

then

echo N non s t r e t t a m e n t e p o s i t i v o : ”$N”

e x i t 1 f i

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# R i c e r c a r i c o r s i v a e s 5 5 r . sh $G $D $N

# Uso d i $ ?

echo T r o v a t i $ ? f i l e c h e s o d d i s f a n o l a c o n d i z i o n e

10. (15 minuti) es55r.sh Ricerca ricorsiva della parte shell del compito del 6 febbraio 2009 Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 6 f e b b r a i o 2009 − r i c e r c a

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>D, $3−>N cd $1

D=$2 N=$3

# R i c e r c a d i r e c t o r y c h e s o d d i s f a n o l a r i c h i e s t a

# C o n t r o l l o c h e i l d i r e t t o r i o c o r r e n t e s i c h i a m i $D case ‘pwd‘ i n

∗/$D) nomeok = 1 ; ;

(11)

∗ ) nomeok = 0 ; ; e s a c

c o n t a f i l e =0 l i s t a =” ”

f o r f i l e n a m e i n ∗ do

i f [ −f $ f i l e n a m e −a −r $ f i l e n a m e ] then

dim=‘wc −c < $ f i l e n a m e ‘ i f [ $dim −g t $N ] then

c o n t a f i l e =‘expr $ c o n t a f i l e + 1 ‘ l i s t a =” $ l i s t a $ f i l e n a m e ”

f i f i

done

# C o n t r o l l o c o n d i z i o n i

i f [ $ c o n t a f i l e −ge 1 −a $nomeok −eq 1 ] then

echo Trovata d i r e c t o r y ‘pwd‘

# Azione

cat $ l i s t a > SOMMA f i

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $D $N

c o n t a f i l e =‘expr $ c o n t a f i l e + $ ? ‘ f i

done

e x i t $ c o n t a f i l e

11. (10 minuti) es56p.sh Controllo parametri della parte shell del compito del 16 settembre 2008 : La parte in Shell deve prevedere due parametri: il primo parametro deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system e il secondo parametro deve essere una stringa (F). Il programma deve cercare nella gerarchia G specificata tutti i direttori (compresa la radice) che contengono, fra gli altri, 2 file i cui nomi sono uguali a F.1 e F.2 e la cui lunghezza in linee e in caratteri deve essere la stessa: si riporti il nome assoluto di tali direttori sullo standard output.

Per ogni direttorio che soddisfa la condizione precedente, si deve invocare la parte C passando i due file trovati F.1 e F.2 come parametri.

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 16 s e t t e m b r e 2008 p r i n c i p a l e

# D a t i : $1−>G $2−>F

# C o n t r o l l o a r g o m e n t i =2=

case $# i n 2 ) ; ;

∗ ) echo Uso : $0 G F ; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

(12)

F=” $2 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# Nessun c o n t r o l l o su F , sempre s t r i n g a

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# R i c e r c a r i c o r s i v a e s 5 6 r . sh $G $F

12. (15 minuti) es56r.sh Ricerca ricorsiva della parte shell del compito del 16 settembre 2008 Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 16 s e t t e m b r e 2008 r i c e r c a

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>F cd $1

F=” $2 ”

# R i c e r c a d i r e c t o r y c h e s o d d i s f a n o l a r i c h i e s t a dimF1=NO

i f [ −f ”$F . 1 ” −a −r ”$F . 1 ” ] then

dimF1=‘wc − l < ”$F . 1 ” ‘ f i

dimcF1=NO

i f [ −f ”$F . 1 ” −a −r ”$F . 1 ” ] then

dimcF1=‘wc −c < ”$F . 1 ” ‘ f i

i f [ −f ”$F . 2 ” −a −r ”$F . 2 ” ] then

dimF2=‘wc − l < ”$F . 2 ” ‘ dimcF2=‘wc −c < ”$F . 2 ” ‘

i f [ $dimF2 = $dimF1 −a $dimcF2 = $dimcF1 ] then

echo Trovata d i r ‘pwd‘

parteC ”$F . 1 ” ”$F . 2 ” f i

f i

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $F

(13)

f i done

13. (10 minuti) es57p.sh Controllo parametri della parte shell del compito del 10 febbraio 2006 : 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 (compresa la radice) tutti i direttori che hanno nome D e che contengono un numero di file pari al numero di sotto-direttori pi`u 2: si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato, si deve creare un numero di sotto-direttori in modo che venga pareggiato il numero di file e sotto-direttori: i nomi dei sotto-direttori da creare devono essere chiesti interattivamente all’utente.

La parte in Shell deve calcolare il numero totale di sotto-direttori effettivamente creati nella gerarchia G e stamparlo sullo standard output.

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 10 f e b b r a i o 2006 − p r i n c i p a l e

# D a t i : $1−>G $2−>D

# C o n t r o l l o a r g o m e n t i =2=

case $# i n 2 ) ; ;

∗ ) echo Uso : $0 G D; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

D=” $2 ”

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o D nome r e l a t i v o s e m p l i c e case ”$D” i n

/ ∗ ) echo D non r e l a t i v o ; e x i t 1 ; ;

∗ / ∗ ) echo D non s e m p l i c e ; e x i t 1 ; ;

∗ ) ; ; # Ok , non c o n t i e n e / e s a c

# ATTN: non c o n t r o l l a r e c h e D e s i s t a n e l l a d i r c o r r e n t e !

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# R i c e r c a r i c o r s i v a e s 5 7 r . sh $G $D

# Uso d i $ ?

echo C r e a t i $ ? d i r e t t o r i

14. (15 minuti) es57r.sh Ricerca ricorsiva della parte shell del compito del 10 febbraio 2006

(14)

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 10 f e b b r a i o 2006 − r i c e r c a

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>D cd $1

D=$2

# R i c e r c a d i r e c t o r y c h e s o d d i s f a n o l a r i c h i e s t a

# C o n t r o l l o c h e i l d i r e t t o r i o c o r r e n t e s i c h i a m i $D case ‘pwd‘ i n

∗/$D) nomeok = 1 ; ;

∗ ) nomeok = 0 ; ; e s a c

numdir=0 n u m f i l=0 c r e a t i =0

f o r f i l e n a m e i n ∗ do

i f [ −f $ f i l e n a m e ] then

n u m f i l =‘expr $ n u m f i l + 1 ‘ f i

i f [ −d $ f i l e n a m e ] then

numdir =‘expr $numdir + 1 ‘ f i

done

# C o n t r o l l o c o n d i z i o n i

i f [ $ n u m f i l −eq ‘ expr $numdir + 2 ‘ −a $nomeok −eq 1 ] then

echo Trovata d i r e c t o r y ‘pwd‘

# Azione

while [ $numdir − l e $ n u m f i l ] do

echo −n ”Nome d i r : ” read nome

mkdir $nome i f [ $ ? −eq 0 ] then

numdir =‘expr $numdir + 1 ‘ c r e a t i =‘expr $ c r e a t i + 1 ‘ f i

done f i

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $D

c r e a t i =‘expr $ c r e a t i + $ ? ‘ f i

done

e x i t $ c r e a t i

(15)

15. (10 minuti) es58p.sh Controllo parametri della parte shell del compito del 26 giugno 2007 : La parte in Shell deve prevedere un numero variabile N+1 di parametri: il primo deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system; mentre gli altri N parametri devono essere considerati singoli caratteri C1, C2, . . . CN. Il programma deve cercare nella gerarchia G specificata tutti i file che siano di dimensione pari e che contengono (nel contenuto) tutti i caratteri Ci. Si riporti il nome assoluto di tali file sullo standard output. Per ogni file trovato F, si deve invocare la parte in C, passando come parametri F e i caratteri C1, C2, . . . CN.

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 26 g i u g n o 2007 − p r i n c i p a l e

# D a t i : $1−>G $2−>C1 $3−>C2 . . . CN

# C o n t r o l l o a r g o m e n t i >1 case $# i n

0 | 1 ) echo Uso : $0 G C1 C2 . . . CN; e x i t 1 ; ;

∗ ) ; ; e s a c

# Assegnamento nomi G=” $1 ”

s h i f t

# C o n t r o l l o G a s s o l u t o case ”$G” i n

/ ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o Cn s i n g o l i c a r a t t e r i f o r Cx i n $ ∗

do

case ”$Cx” i n

? ) ; ;

∗ ) echo ”$Cx” non s i n g o l o c a r . ; e x i t 1 ; ; e s a c

done

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# R i c e r c a r i c o r s i v a e s 5 8 r . sh $G $ ∗

16. (15 minuti) es58r.sh Ricerca ricorsiva della parte shell del compito del 26 giugno 2007 Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 26 g i u g n o 2007 − r i c e r c a

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>C1 $3−>C2 . . . cd $1

s h i f t

# R i c e r c a f i l e c h e s o d d i s f a n o l a r i c h i e s t a

(16)

c o n t i e n e =1

f o r f i l e n a m e i n ∗ do

i f [ −f $ f i l e n a m e −a −r $ f i l e n a m e ] then

dim=‘wc −c < $ f i l e n a m e ‘ f o r Cx i n $ ∗

do

g r e p −q $Cx $ f i l e n a m e i f [ $ ? −ne 0 ]

then

c o n t i e n e =0 f i

done

i f [ ‘ expr $dim % 2 ‘ −eq 0 −a $ c o n t i e n e −eq 1 ] then

echo Trovato ‘pwd‘ / $ f i l e n a m e parteC $ f i l e n a m e $ ∗

f i f i

done

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $ ∗ f i

done

17. (10 minuti) es59p.sh Controllo parametri della parte shell del compito del 17 giugno 2008 : La parte in Shell deve prevedere 2 parametri: il primo deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system, mentre il secondo parametro deve essere considerato un numero intero strettamente positivo (K). Il programma deve cercare nella gerarchia G specificata tutti i direttori che contengono file che abbiano numero di linee uguale a K. Si riporti il nome assoluto di tali direttori sullo standard output. In ognuno di tali direttori trovati, per ogni file Fi trovato (F1, F2, . . . FN) che soddisfa la condizione precedente si deve produrre un ordinamento delle linee secondo il normale ordine alfabetico ridirigendo il risultato su un file di nome Fi.sort. Quindi, sempre in ogni direttorio trovato, si deve invocare la parte in C, passando come parametri i nomi dei file generati (F1.sort, F2.sort, . . . FN.sort).

Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 17 g i u g n o 2008 − p r i n c i p a l e

# D a t i : $1−>G $2−>K

# C o n t r o l l o a r g o m e n t i ==2 case $# i n

2 ) ; ;

∗ ) echo Uso : $0 G K; e x i t 1 ; ; e s a c

# Assegnamento nomi G=” $1 ”

K=” $2 ”

# C o n t r o l l o G a s s o l u t o

(17)

case ”$G” i n / ∗ ) ; ;

∗ ) echo G non a s s o l u t o : ”$G” ; e x i t 1 ; ; e s a c

# C o n t r o l l o G d i r e c t o r y e s i s t e n t e , l e g g i b i l e ed e s p l o r a b i l e i f [ ! −d ”$G” −o ! −x ”$G” ]

then

echo G non d i r e c t o r y e s p l o r a b i l e e x i t 1

f i

# C o n t r o l l o K numerico

expr ”$K” + 0 > / dev / n u l l 2>&1 case $ ? i n

0 ) ; ; # r i s u l t a t o != 0 1 ) ; ; # r i s u l t a t o == 0

2 ) echo K non nu me ri c o : ”$K” ; e x i t 1 ; ; # s y n t a x e r r o r , e s . K=’+’

3 ) echo K non nu me ri c o : ”$K” ; e x i t 1 ; ; # non−numeric argument , e s . K=’a ’ e s a c

# C o n t r o l l o K s t r e t t a m e n t e p o s i t i v o i f [ $K − l e 0 ]

then

echo K non s t r e t t a m e n t e p o s i t i v o : ”$K”

e x i t 1 f i

# P r e d i s p o s i z i o n e e s e c u z i o n e PATH=‘pwd ‘ : $PATH

export PATH

# I n i z i o r i c e r c a e s 5 9 r . sh $G $K

18. (15 minuti) es59r.sh Ricerca ricorsiva della parte shell del compito del 17 giugno 2008 Soluzione:

#! / b i n / s h

# S o l u z i o n e p r o v a d e l 17 l u g l i o 2008 − r i c e r c a

# D a t i : $1−>d i r e c t o r y da e s p l o r a r e $2−>K cd $1

K=$2

# R i c e r c a d i r e c t o r y c h e s o d d i s f a n o l a r i c h i e s t a t r o v a t o =0

l i s t a =” ” l i s t a s =” ” f o r F i i n ∗ do

i f [ −f $ F i −a −r $ F i ] then

dim=‘wc − l < $Fi ‘ i f [ $dim −eq $K ] then

t r o v a t o =1

l i s t a =” $ l i s t a $ F i ” f i

f i done

(18)

# C o n t r o l l o su t r o v a t o i f [ $ t r o v a t o −eq 1 ] then

echo Trovata d i r e c t o r y ‘pwd‘

f o r F i i n $ l i s t a do

s o r t $ F i > $ F i . s o r t

l i s t a s =” $ l i s t a s $ F i . s o r t ” done

parteC $ l i s t a s f i

# I n v o c a z i o n e r i c o r s i v a f o r f i l e n a m e i n ∗

do

i f [ −d $ f i l e n a m e −a −x $ f i l e n a m e ] then

$0 $ f i l e n a m e $K f i

done

Riferimenti

Documenti correlati

[9 punti] Dato il seguente frammento di schema relazionale, in cui i vincoli di integrità referenziale sono quelli ovvi,.. Esperto(codiceEsperto, cognome, nome)

(15 minuti) es88.c Recupero degli exit value dei processi figli: modificare es88.c in modo che il processo padre attenda la terminazione di tutti i processi figli riportando su

Far creare al padre N processi (con N valore del primo argomento) ed utilizzare una singola pipe per passare una struttura di dati da ogni figlio al

Ognuno di tali processi figli deve creare un file il cui nome (FiK) risulti dalla concatenazione del nome del file associato (Fi) con la stringa che corrisponde al numero K;

Determinare con un programma c (es111.c) il segnale che causa la terminazione di un processo figlio quando questo tenta di scrivere su una pipe con lato di lettura chiuso

2) I file prodotti devono essere collocati in un sottodirettorio della propria HOME directory che deve essere creato e avere nome ESAME15Feb12-1-1. FARE ATTENZIONE AL NOME

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 e il secondo

La parte in Shell deve prevedere un numero variabile di parametri Q+1 (con Q maggiore o uguale a 2): il primo parametro deve essere il nome assoluti di