• Non ci sono risultati.

Lab. di Sistemi Operativi Esercitazioni proposte per la lezione del 8 aprile 2011

N/A
N/A
Protected

Academic year: 2021

Condividi "Lab. di Sistemi Operativi Esercitazioni proposte per la lezione del 8 aprile 2011"

Copied!
13
0
0

Testo completo

(1)

Lab. di Sistemi Operativi

Esercitazioni proposte per la lezione del 8 aprile 2011

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

1. (15 minuti) es61p.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).

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

3. (15 minuti) es62p.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.

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

5. (15 minuti) es63p.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.

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

7. (15 minuti) es64p.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.

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

(2)

9. (15 minuti) es65p.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.

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

11. (15 minuti) es66p.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).

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

(3)

Soluzione

Esercitazioni proposte per la lezione del 8 aprile 2011

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

1. (15 minuti) es61p.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 6 1 − 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 ; ; esac

# 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 ; ; esac

# 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 / esac

# 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 export PATH=‘pwd ‘ : $PATH

# Prima i n v o c a z i o n e FCR f a s e A e s 6 1 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

(4)

S | s ) ; ;

N| n ) e x i t 0 ; ; esac

e s 6 1 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 6 1 r . sh $G $D A

2. (15 minuti) es61r.sh Ricerca ricorsiva del quesito della precedente domanda 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 (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

3. (15 minuti) es62p.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

(5)

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 ; ; esac

# Assegnamento nomi G=” $1 ”

D=” $2 ” 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 ; ; esac

# 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 / esac

# 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 num e ric o : ”$N” ; e x i t 1 ; ; # s y n t a x e r r o r , e s . N=’+’

3 ) echo N non num e ric o : ”$N” ; e x i t 1 ; ; # non−numeric argument , e s . N=’a ’ esac

# 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 export PATH=‘pwd ‘ : $PATH

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

# Uso d i $ ?

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

(6)

4. (15 minuti) es62r.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 ; ;

∗ ) nomeok = 0 ; ; esac

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

5. (15 minuti) es63p.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.

(7)

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 ; ; esac

# Assegnamento nomi G=” $1 ”

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 ; ; esac

# 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 export PATH=‘pwd ‘ : $PATH

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

6. (15 minuti) es63r.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

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

dimF2=‘wc − l < ”$F . 2 ” ‘ i f [ $dimF2 = $dimF1 ] then

echo Trovata d i r ‘pwd‘

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

(8)

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 f i

done

7. (15 minuti) es64p.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 ; ; esac

# 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 ; ; esac

# 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 / esac

# 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 export PATH=‘pwd ‘ : $PATH

# R i c e r c a r i c o r s i v a

(9)

e s 6 4 r . sh $G $D

# Uso d i $ ?

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

8. (15 minuti) es64r.sh Ricerca ricorsiva della parte shell del compito del 10 febbraio 2006 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 ; ; esac

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 t $ 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

(10)

$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

9. (15 minuti) es65p.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 ; ;

∗ ) ; ; esac

# 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 ; ; esac

# 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 ; ; esac

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 export PATH=‘pwd ‘ : $PATH

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

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

(11)

#! / 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 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

11. (15 minuti) es66p.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 ) ; ;

(12)

∗ ) echo Uso : $0 G K; e x i t 1 ; ; esac

# 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 ; ; esac

# 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 num e ric 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 num e ric o : ”$K” ; e x i t 1 ; ; # non−numeric argument , e s . K=’a ’ esac

# 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 export PATH=‘pwd ‘ : $PATH

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

12. (15 minuti) es66r.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

(13)

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

# 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

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

(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

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

Ognuno di tali processi figli esegue concorrentemente, leggendo tutte le X linee del file associato Fj: per ogni linea letta, il figlio Pi deve trovare il primo carattere

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