Advertisement
Vladpepe

Untitled

Apr 2nd, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.39 KB | None | 0 0
  1. La parte in Shell deve prevedere tre parametri: il primo deve essere il nome assoluto di un direttorio che
  2. identifica una gerarchia (G) all’interno del file system, il secondo parametro deve essere il nome relativo
  3. semplice di un file (F), mentre il terzo parametro deve essere considerato un numero intero positivo (N). Il
  4. comportamento atteso dal programma, dopo il controllo dei parametri, è organizzato in generale in tre fasi (Fasi
  5. A, B e C).
  6. Il programma deve cercare nella gerarchia G specificata (inclusa la radice) - tramite un file comandi ricorsivo,
  7. FCR - tutti i direttori che contengono un file che ha nome relativo F: si riporti il nome assoluto di tali direttori
  8. sullo standard output e si contino globalmente i file che soddisfano la condizione indicata (Fase A).
  9. Al termine dell’intera esplorazione ricorsiva di G, si deve riportare sullo standard output il numero totale di file
  10. (NF) che soddisfano la condizione indicata. In caso NF sia minore di N, il programma passa alla Fase B: si deve
  11. reinvocare FCR in modo da cercare nella gerarchia G specificata (inclusa la radice) tutti i direttori che NON
  12. contengono un file con nome relativo F, riportando sullo standard output il nome assoluto dei direttori trovati e
  13. creando un file vuoto con nome relativo F all'interno di ognuno.
  14. Quindi, se è stato necessario eseguire la Fase B, si deve passare alla Fase C in cui si deve verificare la situazione
  15. risultante invocando nuovamente FCR come per la Fase A.
  16. NOTA BENE: FCR dovrà prevedere un parametro ulteriore rispetto a G, F e N per differenziare l'esecuzione
  17. delle diverse Fasi.
  18.  
  19. #! /bin/sh
  20. #Controllo che ci siano esattamente 3 parametri
  21. case $# in
  22. 3);;
  23. *) echo "Numero sbagliato di parametri: ci vogliono 3 parametri (nome ass dir, nome relativo file da cercare e numero intero positivo"
  24. exit 1;;
  25. esac
  26.  
  27. G=$1
  28. F=$2
  29. N=$3
  30.  
  31. #Controllo che sia il nome assoluto di direttorio
  32. case $G in
  33.     /*);;
  34.     *) echo "$G non e' in forma assoluta"
  35.        exit 2;;
  36. esac
  37. #Controllo che sia un direttorio esplorabile
  38. if test ! -d $G -o ! -x $G
  39. then
  40.     echo "$G non e' un direttorio o non e' esplorabile"
  41.     exit 3
  42. fi
  43.  
  44. #Controllo che F sia un nome relativo
  45. case $F in
  46.     */*) echo "$F non  e' in forma relativa"
  47.          exit 4;;
  48.     *);;
  49. esac
  50.  
  51. #Controllo che sia un numero > 0
  52. test $N -gt 0 1>/dev/null 2>/dev/null
  53. case $? in
  54.     0);;
  55.     *) echo "$N non e'  una stringa o non e' strettamente > 0"
  56.        exit 5;;
  57. esac
  58.  
  59. PATH=`pwd`:$PATH
  60. export PATH
  61.  
  62. #creaiamo un file temporaneo che serve solo per riportare le cose poi alla situazione precedente: non richiesto dalla soluzione
  63. >  /tmp/perPulisci
  64.  
  65. #Fase A
  66. #usiamo un file temporaneo che passeremo come ultimo parametro
  67. > /tmp/esame$$
  68. FCR.sh $G $F A /tmp/esame$$
  69. #conto il numero di righe sul file temporaneo=numero di file trovati
  70. NF=`wc -l < /tmp/esame$$`
  71. echo "File trovati fase A: $NF"
  72.  
  73. #Se il numero file < N eseguo la fase B e C
  74. if test $NF -lt $N
  75. then    
  76.     FCR.sh $G $F B #nella fase B il file temporaneo non serve e quindi possiamo non passarlo!
  77.     > /tmp/esame$$ #azzeriamo il file temporaneo
  78.     FCR.sh $G $F C /tmp/esame$$
  79.     #Riconto il numero di righe per controllare il numero dei file
  80.     NF=`wc -l < /tmp/esame$$`
  81.     echo "File trovati fase C: $NF"
  82. fi
  83. #da ultimo cancelliamo il file temporaneo
  84. rm /tmp/esame$$
  85. -------------------------------------------------------------------------------------------------------------------------------
  86. #! /bin/sh
  87. cd $1
  88.  
  89. #se il terzo parametro: flag=A o C
  90. #cerco i file che si chiamano F e se ne trovo uno scrivo il nome assoluto del direttorio
  91. #nome assoluto del file trovato su un file temporaneo
  92. if test "$3" = A -o "$3" = C
  93. then    
  94.     #echo fase $3
  95.     if test -f $2
  96.     then
  97.         echo "Trovato $2 in `pwd`"
  98.         echo    "`pwd`/$i" >> $4
  99.     fi
  100. fi
  101.  
  102. #se il terzo parametro e' uguale a B invoco la seconda fase
  103. #dove cerco i direttori in cui non ci sono file che si chiamano F
  104. if test "$3" = B
  105. then   
  106.     #echo fase $3
  107.     trovato=0
  108.         if test -f $2
  109.     then
  110.         trovato=1
  111.     fi
  112. #se non trovo un file scrivo il nome del direttorio sullo stdout
  113.     if test $trovato -eq 0
  114.     then    
  115.         echo "In `pwd` non c'e' un file che si chiama $2 e quindi lo creo"
  116.         > $2
  117.         echo "`pwd`/$2" >> /tmp/perPulisci
  118.     fi
  119. fi
  120.  
  121. #se trovo un direttorio esplorabile
  122. #richiamo la ricorsione con il terzo parametro come flag
  123. for i in *
  124. do
  125.     if test -d $i -a -x $i  
  126.     then
  127.         #echo ricorsione
  128.         FCR.sh `pwd`/$i $2 $3 $4 #nella fase B $4 sara' nulllo
  129.     fi
  130. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement