Advertisement
Vladpepe

Untitled

Apr 2nd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.30 KB | None | 0 0
  1. La parte in Shell deve prevedere un solo parametro che deve essere il nome assoluto di un direttorio che
  2. identifica una gerarchia (G) all’interno del file system. Il comportamento atteso dal programma, dopo il controllo
  3. dei parametri, è organizzato in due fasi (Fasi A e B).
  4. Il programma nella fase A deve esplorare la gerarchia G specificata - tramite un file comandi ricorsivo, FCR - e
  5. deve contare globalmente i livelli di cui è costituita la gerarchia G (inclusa la radice).
  6. Al termine dell’intera esplorazione ricorsiva di G, si deve riportare sullo standard output il numero di livelli
  7. totali della gerarchia G. Quindi il programma passa nella fase B. In questa fase B, il programma deve chiedere
  8. all’utente un numero pari compreso fra 1 e il numero di livelli totali calcolati nella faseA: quindi si deve
  9. reinvocare FCR in modo da cercare nella gerarchia G specificata (inclusa la radice) tutti i direttori che si trovano
  10. al livello corrispondente al numero pari specificato dall’utente e per ognuno di essi si devono visualizzare
  11. TUTTE le informazioni associate agli elementi presenti esclusi i file nascosti.
  12.  
  13. #!/bin/sh
  14.  
  15. case $# in
  16. 1)  case $1 in
  17.     /*) if test ! -d $1 -o ! -x $1
  18.         then
  19.         echo $1 non direttorio
  20.         exit 1
  21.         fi;;
  22.     *)  echo $1 non nome assoluto; exit 2;;
  23.     esac;;
  24. *)  echo Errore: Usage is $0 dirass
  25.     exit 3;;
  26. esac
  27. PATH=`pwd`:$PATH
  28. export PATH
  29. conta=0
  30. fase=A
  31. livello=0
  32.  
  33. echo $conta > /tmp/tmpContaLivelli #scriviamo il valore di conta (cioe' 0) nel file temporaneo
  34.  
  35. #invochiamo per la fase A: il quarto parametro ($livello) NON viene usato nella prima fase, ma lo passiamo lo stesso per uniformita'
  36. echo Stiamo iniziando la fase A
  37. FCR.sh $1 $conta $fase $livello  
  38.  
  39. #tot=`cat /tmp/tmpContaLivelli`
  40. read tot < /tmp/tmpContaLivelli
  41. echo Il numero di livelli totali della gerarchia = $tot
  42. #passiamo alla seconda fase
  43. echo Stiamo iniziando la fase B
  44. #adesso chiediamo all'utente quale livello vuole visualizzare
  45. echo -n "dammi il numero di livello pari che vuoi visualizzare (il numero deve essere compreso fra 1 e $tot " > /dev/tty
  46. read livello #chiediamo all'utente il numero di livello
  47. #echo $livello
  48. case $livello in
  49. *[!0-9]*) echo NON hai fornito un numero o non positivo
  50.           exit 4;;
  51. *) #numero giusto;;
  52. esac
  53. if test $livello -ge 1 -a $livello -le $tot
  54. then
  55. echo $livello compreso OK
  56. if test `expr $livello % 2` -eq 0
  57. then
  58.     echo $livello pari
  59. else
  60.     echo $livello dispari #questo sarebbe un errore per il testo considerato, ma lo teniamo buono per fare un numero maggiore di prove
  61. fi
  62. else
  63.     echo $livello NON compreso
  64. exit 5
  65. fi
  66. fase=B
  67. #passiamo alla seconda chiamata
  68. echo $conta > /tmp/tmpContaLivelli #riscriviamo il valore di conta (cioe' 0) nel file temporaneo
  69.  
  70. FCR.sh $1 $conta $fase $livello  
  71. #rimuoviamo il file temporaneo
  72. rm /tmp/tmpContaLivelli
  73. echo FINITO
  74. --------------------------------------------------------------------------------------------------------------------------------------
  75. #!/bin/sh
  76. #file comandi ricorsivo che torna il numero totale di livelli
  77. #contati fino a quel punto
  78.  
  79. #echo siamo nella fase $3
  80. cd $1
  81. #il primo livello verra' contato come livello 1
  82. conta=`expr $2 + 1`  #nota bene questa variabile conta NON e' quella dello script principale, ma e' una variabile conta LOCALE a questo script
  83. for i in *
  84. do
  85.     if test -d $i -a -x $i
  86.     then    
  87. #       echo stiamo per andare in `pwd`/$i
  88.         FCR.sh `pwd`/$i $conta $3 $4
  89.         ret=$?
  90.         #prec=`cat /tmp/tmpContaLivelli` #oppure si puo' fare con read in ridirezione
  91.                 read prec < /tmp/tmpContaLivelli #leggiamo dal file temporaneo il valore del numero di livello
  92. #       echo prec = $prec e ret = $ret 
  93.         if test $ret -gt $prec       #se il valore calcolato in ricorsione e' maggiore, allora
  94.         then
  95.         echo $ret > /tmp/tmpContaLivelli #aggiorniamo il numero di livello raggiunto
  96.         fi
  97.     fi
  98. done
  99. #echo in `pwd` conta = $conta
  100. if test $3 = B
  101. then
  102. #echo siamo passati alla fase $3
  103.     if test $4 -eq $conta #se nella seconda fase sono in una directory che corrisponde al livello cercato, dobbiamo stampare le info richieste
  104.     then
  105.         echo  Adesso visualizzo il contenuto del direttorio `pwd` che fa parte del livello $4
  106.         ls -l #se dovessimo visualizzare tutte le info inclusi i file nascosti sarebbe ls -la oppure inclusi i file nascosci a parte . e .. sarebbe ls -lA
  107.     fi
  108. fi
  109. exit $conta
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement