Lab. di Sistemi Operativi
Esercitazioni proposte per la lezione del 1 aprile 2011
Utilizzando la shell di Linux e disponendosi in gruppi di due persone per ogni PC del laboratorio.
1. (40 minuti) es51p.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) allinterno 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.
2. (40 minuti) es51r.sh Ricerca ricorsiva della parte shell del compito del 17 luglio 2007
3. (40 minuti) es52p.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) allinterno 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 dellultimo file trovato (Fi) sullo standard output. Al termine dellintera esplorazione ricorsiva di G, si deve invocare la parte C passando come parametri tutti i nomi assoluti dei file Fi trovati.
4. (40 minuti) es52r.sh Ricerca ricorsiva della parte shell del compito del 3 aprile 2009
Soluzione
Esercitazioni proposte per la lezione del 1 aprile 2011
Utilizzando la shell di Linux e disponendosi in gruppi di due persone per ogni PC del laboratorio.
1. (40 minuti) es51p.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) allinterno 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.
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 ; ; esac
# 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 ; ; 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 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 ; ; esac
# 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 ; ; esac
# 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 5 1 r . sh $G $Cx $Cy
2. (40 minuti) es51r.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
# 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 ] then
case $ f i l e n a m e i n
∗$Cx∗$Cy ∗ ) nomeok = 1 ; ;
∗$Cy∗$Cx ∗ ) nomeok = 1 ; ;
∗ ) nomeok = 0 ; ; esac
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 c o n t a f i l e 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‘ con $ c o n t a f i l e f i l e 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
3. (40 minuti) es52p.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) allinterno 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 dellultimo file trovato (Fi) sullo standard output. Al termine dellintera 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
2 ) ; ;
∗ ) 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
# 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 export PATH=‘pwd ‘ : $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 2 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
4. (40 minuti) es52r.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
# 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 =” ”
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 $ 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 Trovata d i r e c t o r y ‘pwd‘ con $ c o n t a f i l e 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