Advertisement
Vladpepe

Untitled

Apr 2nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.12 KB | None | 0 0
  1. #!/bin/sh
  2. #Soluzione della Prima Prova in itinere del 15 Aprile 2016
  3. #versione che usa un file temporaneo e usa FCR.sh per tutte le fasi
  4.  
  5. case $# in
  6. 0|1|2|3)    echo Errore: numero parametri is $# quindi pochi parametri. Usage is $0 numero dirass1 dirass2 ...
  7.         exit 1;;
  8. *)      echo OK: da qui in poi proseguiamo con $# parametri ;;
  9. esac
  10. #dobbiamo isolare l'ultimo parametro e intanto facciamo i controlli
  11. num=1   #la variabile num ci serve per capire quando abbiamo trovato l'ultimo parametro
  12. params= #la variabile params ci serve per accumulare i parametri a parte l'ultimo
  13. #in $* abbiamo i nomi delle gerarchie e il numero intero
  14. for i
  15. do
  16.     if test $num -ne $# #ci serve per non considerare l'ultimo parametro che e' il numero
  17.     then
  18.         params="$params $i"
  19.     #soliti controlli su nome assoluto e direttorio traversabile
  20.         case $i in
  21.         /*)     if test ! -d $i -o ! -x $i
  22.                 then
  23.                 echo $i non direttorio
  24.                 exit 2
  25.                 fi;;
  26.         *)  echo $i non nome assoluto; exit 3;;
  27.         esac
  28.     else
  29.     #abbiamo individuato l'ultimo parametro e quindi facciamo il solito controllo su numerico e strettamente positivo
  30.         X=$i #salviamo l'ultimo parametro
  31.         #Controllo ultimo  parametro
  32.         expr $X + 0  > /dev/null 2>&1
  33.         N1=$?
  34.         if test $N1 -ne 2 -a $N1 -ne 3
  35.         then #echo numerico $1 siamo sicuri che numerico
  36.                 if test $X -le 0
  37.                 then echo $X non strettamente positivo
  38.                 exit 4
  39.                 fi
  40.         else
  41.             echo $X non numerico
  42.             exit 5
  43.         fi
  44.     fi
  45.     num=`expr $num + 1` #incrementiamo il contatore del ciclo sui parametri
  46. done
  47. #controlli sui parametri finiti possiamo passare alle N fasi
  48. PATH=`pwd`:$PATH
  49. export PATH
  50. > /tmp/conta$$ #creiamo/azzeriamo il file temporaneo. NOTA BENE: SOLO 1 file temporaneo!
  51.  
  52. for i in $params
  53. do
  54.     echo fase per $i
  55.     #invochiamo il file comandi ricorsivo con la gerarchia, il numero e il file temporaneo
  56.     FCR.sh $i $X /tmp/conta$$  
  57. done
  58.  
  59. #terminate tutte le ricerche ricorsive cioe' le N fasi
  60. #N.B. Andiamo a contare le linee del file /tmp/conta$$
  61. D=`wc -l < /tmp/conta$$`
  62. echo Il numero di directory totali che soddisfano la specifica = $D
  63. for i in `cat /tmp/conta$$`
  64. do
  65.     #Stampiamo (come richiesto dal testo) i nomi assoluti delle directory trovate
  66.     echo "Trovato il direttorio $i; contiene i seguenti file:"
  67.     cd $i
  68.     for file in * #siamo sicuri che sono solo file (controllo fatto da FCR.sh)
  69.     do
  70.         echo "file: $file"
  71.         echo "la cui linea $X-esima a partire dalla fine e' la seguente:"
  72.         #selezioniamo direttamente la $X-esima linea del file corrente a partire dalla fine
  73.         tail -$X $file | head -1
  74.     done
  75. done
  76. #da ultimo eliminiamo il file temporaneo
  77. rm /tmp/conta$$
  78.  
  79.  
  80. --------------------------------------------------------------------------------------------------
  81.  
  82. #!/bin/sh
  83. #FCR.sh
  84. #file comandi ricorsivo che scrive il nome dei direttori trovati sul file temporaneo
  85. #il cui nome e' passato come terzo argomento
  86.  
  87. cd $1
  88. #la variabile NR ci serve per il numero di linee dei file
  89. NR=0
  90. #la variabile DIR ci serve per capire se ci sono solo file
  91. DIR=false
  92. #la variabile trovato ci serve per capire se tutti i file rispettano la specifica
  93. trovato=true
  94.  
  95. for i in *
  96. do
  97.     #controlliamo solo i nomi dei file (se inseriamo anche il controllo se leggibili per cautelarci dato che dopo usiamo il comando wc bisogna commentarlo!)
  98.     if test -f $i
  99.     then    
  100.         #calcoliamo il numero di linee
  101.         NR=`wc -l < $i`
  102.         #controlliamo se il numero delle linee NON e' strettamente maggiore di X
  103.         if test $NR -le $2
  104.             then
  105.             #abbiamo trovato un file che NON soddisfa le specifiche e quindi mettiamo a false trovato
  106.             trovato=false
  107.         fi
  108.     else
  109.         if test -d $i
  110.         then
  111.         #abbiamo trovato un direttorio e quindi dobbiamo mettere a true DIR
  112.         DIR=true
  113.         fi
  114.     fi
  115. done
  116. #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
  117. if test $DIR = false -a $trovato = true -a $NR -ne 0
  118. then
  119.     pwd >> $3
  120. fi
  121. for i in *
  122. do
  123.     if test -d $i -a -x $i
  124.     then
  125.         #chiamata ricorsiva cui passiamo come primo parametro il nome assoluto del direttorio
  126.         FCR.sh `pwd`/$i $2 $3
  127.     fi
  128. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement