Advertisement
Vladpepe

Untitled

Apr 2nd, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.78 KB | None | 0 0
  1. La parte in Shell deve prevedere un numero variabile N+1 di parametri (con N maggiore o uguale a 2): il primo
  2. parametro deve essere considerato un numero intero X strettamente positivo, mentre gli altri N devono essere
  3. nomi assoluti di direttori che identificano N gerarchie (G1, G2, … GN) all’interno del file system. Il
  4. comportamento atteso dal programma, dopo il controllo dei parametri, è organizzato in N fasi, una per ogni
  5. gerarchia.
  6. Il programma, per ognuna delle N fasi, deve esplorare la gerarchia Gi corrispondente - tramite un file comandi
  7. ricorsivo, FCR.sh - e deve contare globalmente tutti i file leggibili che soddisfano la seguente specifica: il
  8. contenuto del file deve essere tale per cui almeno X linee terminino con il carattere ‘t’. Al termine di tutte le N
  9. fasi, si deve riportare sullo standard output il numero totale di file trovati globalmente che soddisfano la specifica
  10. precedente (file trovati); quindi, si deve riportare sullo standard output il nome assoluto di ogni file trovato
  11. chiedendo contestualmente all’utente un numero K strettamente positivo e strettamente minore di X: tale
  12. numero deve essere usato per riportare sullo standard output la linea K-esima del file trovato corrente.
  13.  
  14. #!/bin/sh
  15. #Soluzione della Prima Prova in itinere del 17 Aprile 2015
  16. #versione che usa un file temporaneo e usa FCR.sh per tutte le fasi
  17.  
  18. case $# in
  19. 0|1|2)  echo Errore: numero parametri is $# quindi pochi parametri. Usage is $0 numero dirass1 dirass2 ...
  20.     exit 1;;
  21. *)  echo OK: da qui in poi proseguiamo con $# parametri ;;
  22. esac
  23. #Controllo primo parametro
  24. expr $1 + 0  > /dev/null 2>&1
  25. N1=$?
  26. if test $N1 -ne 2 -a $N1 -ne 3
  27. then #echo numerico $1 siamo sicuri che numerico
  28.      if test $1 -le 0
  29.      then echo $1 non positivo
  30.           exit 2
  31.      fi
  32. else
  33.   echo $1 non numerico
  34.   exit 3
  35. fi
  36. #in alternativa il controllo sul fatto che il primo parametro sia numerico può essere fatto in questo modo
  37. case $1 in
  38. *[!0-9]*) echo $1 non numerico o negativo
  39.       exit 3;;
  40. *) ;; #nota siamo gia' anche sicuri che e' positivo dato che $1 puo' contenere solo caratteri numerici e quindi non e' presente il carattere -
  41. esac
  42. if test $1 -eq 0
  43. then echo $1 uguale a 0
  44.      exit 2
  45. fi
  46.  
  47. X=$1 #salviamo il primo parametro
  48. #quindi ora possiamo usare il comando shift
  49. shift
  50. #ora in $* abbiamo solo i nomi delle gerarchie e quindi possiamo fare i controlli sui nomi assoluti e sui direttori in un for
  51. for i
  52. do
  53.     case $i in
  54.     /*) if test ! -d $i -o ! -x $i
  55.         then
  56.         echo $i non direttorio
  57.         exit 4
  58.         fi;;
  59.     *)  echo $i non nome assoluto; exit 5;;
  60.     esac
  61. done
  62. #controlli sui parametri finiti possiamo passare alle N fasi
  63. PATH=`pwd`:$PATH
  64. export PATH
  65. > /tmp/conta$$ #creiamo/azzeriamo il file temporaneo. NOTA BENE: SOLO 1 file temporaneo!
  66.  
  67. for i
  68. do
  69.     echo fase per $i
  70.     #invochiamo il file comandi ricorsivo con la gerarchia, il numero e il file temporaneo
  71.     FCR.sh $i $X /tmp/conta$$  
  72. done
  73.  
  74. #terminate tutte le ricerche ricorsive cioè le N fasi
  75. #N.B. Andiamo a contare le linee del file /tmp/conta$$
  76. F=`wc -l < /tmp/conta$$`
  77. echo Il numero di file totali che soddisfano la specifica = $F
  78. for i in `cat /tmp/conta$$`
  79. do
  80.     #Stampiamo (come richiesto dal testo) i nomi assoluti dei file trovati
  81.     echo Trovato il file $i
  82.     #chiediamo all'utente il numero K per ogni file trovato
  83.     echo -n "Dammi il numero K (maggiore di 0 e minore di $X): "
  84.     read K
  85.     #Controllo K
  86.     expr $K + 0  > /dev/null 2>&1
  87.     N1=$?
  88.     if test $N1 -ne 2 -a $N1 -ne 3
  89.     then    #echo numerico $K siamo sicuri che numerico
  90.             if test $K -le 0 -o $K -ge $X
  91.             then echo $K non positivo o non minore di $X
  92.             exit 6
  93.         fi
  94.     else
  95.         echo $K non numerico
  96.         exit 7
  97.     fi
  98.     #selezioniamo direttamente la $K-esima linea del file corrente
  99.         head -$K $i | tail -1
  100. done
  101. #da ultimo eliminiamo il file temporaneo
  102. rm /tmp/conta$$
  103. ----------------------------------------------------------------------------------------------------------------------
  104. #!/bin/sh
  105. #FCR.sh
  106. #file comandi ricorsivo che scrive il nome dei file trovati sul file temporaneo
  107. #il cui nome e' passato come terzo argomento
  108.  
  109. cd $1
  110. #la variabile NG ci serve per il numero di linee trovate dal grep
  111. NG=
  112.  
  113. for i in *
  114. do
  115.     #controlliamo solo i nomi dei file leggibili!
  116.     if test -f $i -a -r $i
  117.     then    
  118.         #controlliamo le linee che terminano con il carattere t (ad esempio)!
  119.         NG=`grep 't$' $i | wc -l`
  120.         #controlliamo che le linee trovate dal grep siano ALMENO X
  121.         if test $NG -ge $2
  122.             then
  123.             #abbiamo trovato un file che soddisfa le specifiche e quindi inseriamo il suo nome assoluto nel file temporaneo
  124.             echo `pwd`/$i >> $3
  125.         fi
  126.     fi
  127. done
  128. for i in *
  129. do
  130.     if test -d $i -a -x $i
  131.     then
  132.         #chiamata ricorsiva cui passiamo come primo parametro il nome assoluto del direttorio
  133.         FCR.sh `pwd`/$i $2 $3
  134.     fi
  135. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement