Advertisement
Vladpepe

Untitled

Apr 2nd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.41 KB | None | 0 0
  1. La parte in Shell deve prevedere un numero variabile di parametri N+1 (N maggiore o uguale a 2): i
  2. primi N parametri devono essere nomi assoluti di direttori che identificano N gerarchie (G1, G2, …)
  3. all’interno del file system, mentre l’ultimo parametro deve essere considerato un numero intero X
  4. strettamente positivo. Il comportamento atteso dal programma, dopo il controllo dei parametri, è
  5. organizzato in N fasi, una per ogni gerarchia.
  6. Il programma, per ognuna delle N fasi, deve esplorare la gerarchia Gi corrispondente - tramite un file
  7. comandi ricorsivo, FCR.sh - e devono contare globalmente tutti i direttori che soddisfano le seguenti
  8. due specifiche: 1) devono contenere solo file (e non sotto-directory) e 2) devono contenere solo file la
  9. cui lunghezza in linee sia strettamente maggiore di X. Al termine di tutte le N fasi, si deve riportare
  10. sullo standard output il numero totale di direttori trovati globalmente che soddisfano la specifica
  11. precedente (direttori trovati). Inoltre, per ogni direttorio trovato, si deve riportare sullo standard output
  12. il suo nome assoluto, e quindi per ognuno dei file (file corrente) in esso contenuto deve essere
  13. riportato sullo standard output il suo nome assoluto e contestualmente la linea X-esima del file
  14. corrente a partire dalla fine del file.
  15.  
  16. #!/bin/sh
  17. #Soluzione della Prima Prova in itinere del 15 Aprile 2016
  18. #versione che usa un file temporaneo e usa FCR.sh per tutte le fasi
  19.  
  20. case $# in
  21. 0|1|2|3)    echo Errore: numero parametri is $# quindi pochi parametri. Usage is $0 numero dirass1 dirass2 ...
  22.         exit 1;;
  23. *)      echo OK: da qui in poi proseguiamo con $# parametri ;;
  24. esac
  25. #dobbiamo isolare l'ultimo parametro e intanto facciamo i controlli
  26. num=1   #la variabile num ci serve per capire quando abbiamo trovato l'ultimo parametro
  27. params= #la variabile params ci serve per accumulare i parametri a parte l'ultimo
  28. #in $* abbiamo i nomi delle gerarchie e il numero intero
  29. for i
  30. do
  31.     if test $num -ne $# #ci serve per non considerare l'ultimo parametro che e' il numero
  32.     then
  33.         params="$params $i"
  34.     #soliti controlli su nome assoluto e direttorio traversabile
  35.         case $i in
  36.         /*)     if test ! -d $i -o ! -x $i
  37.                 then
  38.                 echo $i non direttorio
  39.                 exit 2
  40.                 fi;;
  41.         *)  echo $i non nome assoluto; exit 3;;
  42.         esac
  43.     else
  44.     #abbiamo individuato l'ultimo parametro e quindi facciamo il solito controllo su numerico e strettamente positivo
  45.         X=$i #salviamo l'ultimo parametro
  46.         #Controllo ultimo  parametro
  47.         expr $X + 0  > /dev/null 2>&1
  48.         N1=$?
  49.         if test $N1 -ne 2 -a $N1 -ne 3
  50.         then #echo numerico $1 siamo sicuri che numerico
  51.                 if test $X -le 0
  52.                 then echo $X non strettamente positivo
  53.                 exit 4
  54.                 fi
  55.         else
  56.             echo $X non numerico
  57.             exit 5
  58.         fi
  59.     fi
  60.     num=`expr $num + 1` #incrementiamo il contatore del ciclo sui parametri
  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 in $params
  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 cioe' le N fasi
  75. #N.B. Andiamo a contare le linee del file /tmp/conta$$
  76. D=`wc -l < /tmp/conta$$`
  77. echo Il numero di directory totali che soddisfano la specifica = $D
  78. for i in `cat /tmp/conta$$`
  79. do
  80.     #Stampiamo (come richiesto dal testo) i nomi assoluti delle directory trovate
  81.     echo "Trovato il direttorio $i; contiene i seguenti file:"
  82.     cd $i
  83.     for file in * #siamo sicuri che sono solo file (controllo fatto da FCR.sh)
  84.     do
  85.         echo "file: $file"
  86.         echo "la cui linea $X-esima a partire dalla fine e' la seguente:"
  87.         #selezioniamo direttamente la $X-esima linea del file corrente a partire dalla fine
  88.         tail -$X $file | head -1
  89.     done
  90. done
  91. #da ultimo eliminiamo il file temporaneo
  92. rm /tmp/conta$$
  93.  
  94.  
  95. --------------------------------------------------------------------------------------------------
  96.  
  97. #!/bin/sh
  98. #FCR.sh
  99. #file comandi ricorsivo che scrive il nome dei direttori trovati sul file temporaneo
  100. #il cui nome e' passato come terzo argomento
  101.  
  102. cd $1
  103. #la variabile NR ci serve per il numero di linee dei file
  104. NR=0
  105. #la variabile DIR ci serve per capire se ci sono solo file
  106. DIR=false
  107. #la variabile trovato ci serve per capire se tutti i file rispettano la specifica
  108. trovato=true
  109.  
  110. for i in *
  111. do
  112.     #controlliamo solo i nomi dei file (se inseriamo anche il controllo se leggibili per cautelarci dato che dopo usiamo il comando wc bisogna commentarlo!)
  113.     if test -f $i
  114.     then    
  115.         #calcoliamo il numero di linee
  116.         NR=`wc -l < $i`
  117.         #controlliamo se il numero delle linee NON e' strettamente maggiore di X
  118.         if test $NR -le $2
  119.             then
  120.             #abbiamo trovato un file che NON soddisfa le specifiche e quindi mettiamo a false trovato
  121.             trovato=false
  122.         fi
  123.     else
  124.         if test -d $i
  125.         then
  126.         #abbiamo trovato un direttorio e quindi dobbiamo mettere a true DIR
  127.         DIR=true
  128.         fi
  129.     fi
  130. done
  131. #se i due booleani sono rimasti ai valori iniziali allora abbiamo trovato un direttorio giusto. Nota bene: l'ultimo controllo garantisce che si sia trovato almeno un file
  132. if test $DIR = false -a $trovato = true -a $NR -ne 0
  133. then
  134.     pwd >> $3
  135. fi
  136. for i in *
  137. do
  138.     if test -d $i -a -x $i
  139.     then
  140.         #chiamata ricorsiva cui passiamo come primo parametro il nome assoluto del direttorio
  141.         FCR.sh `pwd`/$i $2 $3
  142.     fi
  143. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement