# Esercizi de Fondamenti di Informatica II # Facolta' di Ingegneria Elettronica dell'Universita' di Ferrara # Copyright (C) 1997 Tarin Gamberini # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this program; if not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # Esercizi de Fondamenti di Informatica II # Facolta' di Ingegneria Elettronica dell'Universita' di Ferrara # Copyright (C) 1997 Tarin Gamberini # # Questo programma è software libero; è lecito redistribuirlo o # modificarlo secondo i termini della Licenza Pubblica Generica # GNU come è pubblicata dalla Free Software Foundation; o la # versione 2 della licenza o (a propria scelta) una versione # successiva. # # Questo programma è distribuito nella speranza che sia utile, ma # SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di # NEGOZIABILITA' o di APPLICABILITA' PER UN PARTICOLARE SCOPO. Si # veda la Licenza Pubblica Generica GNU per avere maggiori # dettagli. # # Questo programma deve essere distribuito assieme ad una copia # della Licenza Pubblica Generica GNU; in caso contrario, se ne # può ottenere una scrivendo alla Free Software Foundation, # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. # Nome file : prova1 # In questo file di prova, verifico il funzionamento dei comandi d'ambiente, # di input/output e della particolarita' di "eval". echo Variabili ambiente, eseguendo il comando : 'env' env echo echo Premi INVIO per continuare... read pausa unset pausa # altrimenti il comando set la visualizza echo Variabili ambiente e locali alla shell, eseguendo il comando : 'set' set echo echo Premi INVIO per continuare... read pausa echo y=3 x='$y' echo Contenuto di y : $y echo Contenuto di x : $x eval echo Contenuto del contenuto di x : $x # Nome file : prova2 # Esempio per studiare la precedenza nelle sostituzioni di shell. dir="ls -lga p*" echo $dir echo echo $dir echo echo `$dir` echo nlin1=`wc -l text | tr 'tex' ' ' ` # Il filtro tr sostituisce OGNI occorrenza dei CARATTERI specificati nella # prima stringa con quello specificato nella seconda. In questo caso # vengono sostituiti con uno spazio OGNI occorenza dei caratteri "t", "e", # "x". Il filtro tr NON sostituisce ogni stringa "tex" con uno spazio, ma # la stringa viene vista come una SERIE DI CARATTERI che, in questo # esercizio, verra' sostituita con 3 SPAZI. nlin2=`wc -l viewdir | tr 'viewdr' ' ' ` lintot=`expr $nlin2+$nlin1` echo La somma delle linee di viewdir+text e\' : $lintot echo cp viewdir temp1 cat text>>temp1 echo Numero di linee della file temp1=viewdir+text : `wc -l temp1` rm temp1 # Nome file : raggruppa # Costruire un file comandi che produca un unico file, risultante dalla # concatenazione di tutti i file presenti nel direttorio corrente. for i in * do if test -f $i then cat $i >> totale fi done # Nome File : cercarw ( CERCA file con diritti Read Write ) # Si cercano i file con il nome specificato che siano leggibili o scrivibili # da ugo (user, group, other), nella gerarchia a partire dal direttorio # specificato. echo case $# in 0) echo Mostra tutti i file con diritti rw in tutta la gerarchia echo a partire dal direttorio specificato. echo echo " Sintassi : $0 [nomefile]" echo; exit;; *) if test ! -d $1 then echo " Sintassi : $0 [nomefile]" echo; exit fi;; esac # essendo cercarw ricorsivo occorre memorizzare in PATH il direttorio in cui # si trova, permettendo cosi' l'invocazione di cercarw da qualunque dir. PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Tuttavia tale istruzione comporta l'allungamento del PATH per ogni shell # figlio creata. E' possibile migliorare con il comando : export PATH cd $1 echo "$1 :" shift # elimino fra i parametri il direttorio cosi' for i in $* # ora $* sono solo nomi di file do if test -f $i # superflua; so gia' che $1=$* sono file then if test -r $i -a -w $i then echo " $i diritti : lettura scrittura" else if test -r $i then echo " $i diritti : lettura" else if test -w $i then echo " $i diritti : scrittura" fi fi fi fi done for i in * do if test -d $i then cercarw $i $* # Invocazione ricorsiva fi done # Nome File : cpsec (CoPy SECurity) # Copia i file specificati come parametri nel direttorio # .copie_di_sicurezza echo case $# in 0) echo Esegue una copia di sicurezza dei file specificati come echo parametri nel direttorio .copie_di_sicurezza echo echo " Sintassi : $0 [nomefile]" echo echo exit ;; esac count=0 echo COPIA DI SICUREZZA FILE in `pwd`/.copie_di_sicurezza echo for i in $* do # solo se $i e' un file viene copiato if test -f $i then echo "$i ===> .copie_di_sicurezza/$i" cp $i .copie_di_sicurezza count=`expr $count + 1` fi done echo case $count in 0) echo Nessun file copiato.;; 1) echo 1 file copiato.;; *) echo $count file copiati.;; esac echo echo # Nome file : viewdir [nome direttorio] # Visualizza tutti i file del direttorio specificato dando per ognuno # alcune informazioni. case $# in 0) echo " Sintassi : $0 'nomedir [nomedir]'" exit;; esac dircorrente=`pwd` for i in $* do echo cd $i echo File presenti nel direttorio $i : for j in * do echo `file $j` done cd $dircorrente /* nel caso che i percorsi specificati */ /* alla riga di comando siano relativi */ /* al direttorio corrente, e non assoluti */ done # Nome File : isindir ( IS IN DIRectory ) # Verifica nella gerarchia di un direttorio specificato la presenza di # file specificati come parametri. echo case $# in 0|1) echo " Sintassi : $0 [nomefile]" echo; exit;; *) if test ! -d $1 then echo " Sintassi : $0 [nomefile]" echo; exit fi;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Permette l'invocazione ricorsiva da qualsiasi dir purtroppo allungando # sempre il PATH nell'ambiente della generica shell figlio. # E' meglio eseguire, una volta modificato PATH, una : export PATH. cd $1 echo "$1 :" shift for i in $* do if test -f $i then echo " $i" fi done for i in * do if test -d $i then isindir $i $* fi done # Nome File : isinpath ( IS IN PATH file ) # Verifica la presenza di file, specificati come parametri, in tutti i # sottodirettori del PATH corrente. echo case $# in 0) echo Verifica la presenza dei file specificati in tutti i echo sottodirettori del PATH corrente. echo echo " Sintassi : $0 [nomefile]" echo; exit;; esac echo "Il PATH corrente e' : $PATH" echo Trovati in PATH i seguenti file : echo for i in `echo $PATH | tr ':' ' '` do cd $i # Quelli del PATH sono sempre percorsi assoluti !!! for j in $* do if test -f $i/$j then echo $i/$j fi done done # Nome File : setd (SETta Diritti) # Setta i diritti specificati in ottale nel primo parametro per ognuno # dei file specificati negli altri parametri echo case $# in 0|1) echo "Sintassi : $0 [nomefile]" echo; echo; exit;; esac if test $# -ge 3 #� perche' esiste anche il parametro dei diritti then echo Il comando cambiera\' i diritti su piu\' file !!! echo "Procedere? (s/n)" read risposta case $risposta in s|S|y|Y) echo Modifica diritti in corso... echo ;; *) echo $0 interrotto !!! echo; echo; exit;; esac fi diritti=$1 shift for i in $* do if test -f $i then chmod $diritti $i fi done count=0 for i in $* # per evitare che setd * comporti ls * do # con visualizzazione indesiderata file delle sottodir if test -f $i then ls -l $i count=`expr $count + 1` fi done echo case $count in 0) echo Modifica diritti di nessun file .;; *) echo Modificati diritti di $count file.;; esac echo echo # Nome File : filtro1 # Scandisce ricorsivamente una gerarchia a partire dal direttorio passato # come parametro, visualizzando i file che iniziano per 'r' solo se si # trovano nei direttori dispari. echo case $# in 0) echo " Sintassi : $0 " echo; exit;; 1) if test ! -d $1 then echo " Nome di direttorio non valido." echo; exit fi;; *) echo " Troppi argomenti." echo; exit;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Per invocazioni ricorsiva livello="" # Conta i livelli export PATH # Esporta il valore modificato di PATH e livello export livello # all'insieme delle variabili d'ambiente. filtro1.2 $1 # Scansione direttori passando quello di partenza # Nome File : filtro1.2 # Scandisce ricorsivamente una gerarchia a partire dal direttorio passato # come parametro, visualizzando i file che iniziano per 'r' solo se si # trovano nei direttori dispari. cd $1 if test -z "$livello" then livello=0 else livello=`expr $livello + 1` fi export livello pari=`expr $livello % 2` if test $pari -eq 0 then echo " Il livello del direttorio <$1> e' pari : $livello." echo " Non si stampa il suo contenuto." echo else echo " Il livello del direttorio <$1> e' dispari : $livello." echo " I file che iniziano per 'r' sono :" for i in r* do if test -f $i then echo " - $i" fi done echo fi for i in * do if test -d $i then filtro1.2 $i fi done # Nome File : filtro2 # Analizza la gerarchia a partire dal nome di direttorio passato come # primo argomento. Per ogni sottodirettorio si deve verificare l'esistenza # di un file con nome uguale a quello passato come secondo argomento. # Di tale file, se leggibile e scrivibile, e se contenente al suo interno # una stringa con il suo stesso nome, si deve stampare il nome assoluto. echo case $# in 0|1) echo " Sintassi : $0 " echo; exit;; 2) if test ! -d $1 then echo " Nome di direttorio non valido." echo; exit fi;; *) echo " Troppi argomenti." echo; exit;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Per invocazioni ricorsiva export PATH filtro2.2 $1 $2 # Scansione direttori # Nome File : filtro2.2 # Analizza la gerarchia a partire dal nome di direttorio passato come # primo argomento. Per ogni sottodirettorio si deve verificare l'esistenza # di un file con nome uguale a quello passato come secondo argomento. # Di tale file, se leggibile e scrivibile, e se contenente al suo interno # una stringa con il suo stesso nome, si deve stampare il nome assoluto. cd $1 for i in * do if test -f $i -a $i = $2 then echo " Verificata esistenza di un file con lo stesso" echo " nome di quello passato come secondo argomento." if test -r $i -a -w $i then if test `grep $2 $i | wc -l` -ge 1 then echo " - Essendo tale file leggibile, scrivibile," echo " e contenente almeno una stringa uguale" echo " al suo nome, stampo il suo nome assoluto:" echo " `pwd`/$i" echo echo else echo " -Tale file e' leggibile e scrivibile ma non" echo " contiene almeno una stringa uguale al suo nome" echo fi else echo " Tale file NON E' leggibile e scrivibile." echo fi fi done for i in * do if test -d $i then filtro2.2 $i $2 fi done # Nome File : filtro3 # A partire dal direttorio passato come primo argomento, stampa tutti i # file e poi uno si ed uno no, per i direttori multipli di un numero # passato come secondo argomento. echo case $# in 0|1) echo " Sintassi : $0 " echo; exit;; 2) if test ! -d $1 then echo " Nome di direttorio non valido." echo; exit fi;; *) echo " Troppi argomenti." echo; exit;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Per invocazioni ricorsiva livello="" # Conta livelli direttorio export PATH export livello filtro3.2 $1 $2 # Scansione ricorsiva direttori # Nome File : filtro3.2 # A partire dal direttorio passato come primo argomento, stampa tutti i # file e poi uno si ed uno no, per i direttori multipli di un numero # passato come secondo argomento. cd $1 if test -z "$livello" then livello=0 else livello=`expr $livello + 1` fi export livello multiplo=`expr $livello % $2` if test $multiplo -eq 0 -a $livello -ne 0 then echo echo " Lista completa dei file in `pwd`" for i in * do if test -f $i then echo " $i" fi done echo echo " Lista file uno si ed uno no" count=0 for i in * do if test `expr $count % 2` -eq 0 -a -f $i then echo " $i" fi if test -f $i then count=`expr $count + 1` fi done fi for i in * do if test -d $i then filtro3.2 $i $2 fi done # Nome File : filtro4 # Il filtro esplora una gerarchia a partire dal nome di direttorio. Deve # verificare per ogni direttorio della gerarchia, se il numero di file # contenuti e' superiore al valore intero passato come secondo argomento. # In tal caso deve fornire in uscita tutti i files il cui numero di linee # sia superiore al valore intero passato come secondo argomento. echo case $# in 0|1) echo " Sintassi : $0 " echo; exit;; 2) if test ! -d $1 then echo " Nome di direttorio non valido." echo; exit fi;; *) echo " Troppi argomenti." echo; exit;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Per invocazioni ricorsiva export PATH filtro4.2 $1 $2 # Scansione direttori # Nome File : filtro4.2 # Il filtro esplora una gerarchia a partire dal nome di direttorio. Deve # verificare per ogni direttorio della gerarchia, se il numero di file # contenuti e' superiore al valore intero passato come secondo argomento. # In tal caso deve fornire in uscita tutti i files il cui numero di linee # sia superiore al valore intero passato come secondo argomento. cd $1 numfile=0 for i in * do if test -f $i then numfile=`expr $numfile + 1` fi done if test $numfile -gt $2 then echo for i in * do if test -f $i -a `cat $i | wc -l` -gt $2 then echo " `pwd`/$i" fi done fi for i in * do if test -d $i then filtro4.2 $i $2 fi done # Nome File : filtro5 # A partire dal direttorio passato come argomento, scrive il nome di ogni # sottodirettorio con relativo livello di profondita', e scrive per i # files che iniziano per e il numero e il nome ma solo se il direttorio # e' pari. echo case $# in 0) echo " Sintassi : $0 " echo; exit;; 1) if test ! -d $1 then echo " Nome di direttorio non valido." echo; exit fi;; *) echo " Troppi argomenti." echo; exit;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Per invocazioni ricorsiva livello="" # Conta profondita' direttorio export PATH export livello filtro5.2 $1 # Scansione direttori # Nome File : filtro5.2 # A partire dal direttorio passato come argomento, scrive il nome di ogni # sottodirettorio con relativo livello di profondita', e scrive per i # files che iniziano per e il numero e il nome ma solo se il direttorio # e' pari. cd $1 if test -z "$livello" then livello=0 else livello=`expr $livello + 1` fi export livello echo echo " Dir `pwd` di livello = $livello." if test `expr $livello % 2` -eq 0 then count=1 for i in e* do if test -f $i then echo " $count) $i" count=`expr $count + 1` fi done fi for i in * do if test -d $i then filtro5.2 $i fi done # Nome File : filtro6 # A partire dal direttorio passato come argomento, stampa i files # contenuti in quei sottodirettori se questo si trova ad un livello # di profondita' multiplo di un numero intero passato come secondo # argomento. echo case $# in 0|1) echo " Sintassi : $0 " echo; exit;; 2) if test ! -d $1 then echo " Nome di direttorio non valido." echo; exit fi;; *) echo " Troppi argomenti." echo; exit;; esac PATH=$PATH:/usr/f_inf_II/gruppo01/.miadir # Per invocazioni ricorsiva livello="" # Conta i livelli export PATH export livello filtro6.2 $1 $2 # Scansione direttori # Nome File : filtro6.2 # A partire dal direttorio passato come argomento, stampa i files # contenuti in quei sottodirettori se questo si trova ad un livello # di profondita' multiplo di un numero intero passato come secondo # argomento. cd $1 if test -z "$livello" then livello=0 else livello=`expr $livello + 1` fi export livello if test `expr $livello % $2` -eq 0 then echo for i in * do if test -f $i then echo " `pwd`/$i" fi done fi for i in * do if test -d $i then filtro6.2 $i $2 fi done # Nome File : filtro7 # Il filtro "filtro7" viene invocato con un argomento numerico e # ridirezionato in ingresso da un file. Costruire il filtro in modo che # ridirezioni sul proprio output il contenuto del file, ma solo ogni # "numero" di linee. # Si preveda una fase di controllo degli argomenti. case $# in 0) echo echo " Sintassi : $0 " echo exit;; 1) if test $1 -le 0 then echo echo " Il numero deve essere > 0." echo exit fi;; *) echo echo " Troppi argomenti." echo exit;; esac count=0 while read linea do if test `expr $count % $1` -eq 0 then echo $linea fi count=`expr $count + 1` done # Nome File : tree ( TREE ) # Simula il comando tree del DOS. echo case $# in 0) set `pwd | tr '/' ' '` for i in $* do dircorrente=$i # dircorrente = nome relativo del done # direttorio corrente. set `echo $dircorrente` # dir. corrente settato in $1 echo $1;; 1) if test ! -d $1 then echo " Direttorio non valido." echo; exit else cd $1 echo $1 fi;; *) echo " Sintassi : $0 " echo; exit;; esac dir_partenza=$1 export dir_partenza PATH=/usr/f_inf_II/gruppo01/.miadir:$PATH export PATH treee $1 1 # dove 1 va inteso come prima ricorsione per sapere quanti # spazi mettere nella grafica dell'albero. # Sarebbe meglio utilizzare una variabile d'ambiente livello, come fatto # nei vari filtri, ma questo e' un esempio per vedere se si riesce a # far funzionare le cose senza variabili esportate, cioe' solamente con # l'uso di argomenti. # Nome File : treee ( secondo file del comando tree ) # Simula il comando tree del DOS. num_ric=$2 space='' while test $num_ric -ne 0 do space=' |'$space num_ric=`expr $num_ric - 1` done for i in * do if test -d $i then echo "$space" echo "$space----$i" cd $i treee $i `expr $2 + 1` cd .. fi done