====== Esercitazione 12 ====== ===== Esercizio 1 ===== Completare le parti mancanti (sia codice che commento) del seguente script bash ''script.sh'', che archivia e comprime tutti i contenuti della cartella specificata come parametro .... # shell da usare per l’interpretazione dello script if [ $# -ne 1 ]; then # (commenta il codice) ........ echo usa: $(basename $0) nomedirectory # ......... exit -1 fi dir=$1 if [ ! -d $dir ]; then # (commenta il codice) ......... echo "L'argomento $dir non e' una directory" exit 1; fi bdir=$(basename $dir) if [ -w ....... ]; then # il file esiste ed e scrivibile echo -n "il file $bdir.tar.gz esiste gia', sovrascriverlo (S/N)?" read yn # (commenta il codice) ......... if [ x$yn != x"S" ]; then # .............. exit 0; fi rm -f $bdir.tar.gz fi echo "creo l'archivio con nome $bdir.tar.gz" tar cf $bdir.tar $dir ............... # appende l’output sullo std-error nel file error.txt if [ ...... ]; then # controlla che il comando sia andato a buon fine echo "Errore nella creazione dell'archivio" exit 1 fi gzip $bdir.tar .......... # appende l’output sullo std-error nel file error.txt if [ ...... ]; then # controlla che il comando sia andato a buon fine echo echo "Errore nella compressione dell'archivio" exit 1 fi echo "archivio creato con successo, il contenuto dell’archivio e':" tar tzvf $bdir.tar.gz ......... # redirige lo std-error sullo std-output exit 0 ===== Esercizio 2 ===== Utilizzando il comando ''find'', stampare la lista di tutti i nomi di file contenuti nella propria home (o in una directory creata appositamente per fare il test) che sono stati modificati negli ultimi 'X' minuti e che contengono al loro interno la parola 'Y' (X è un numero intero Y è una stringa, es. X=2 Y=ciao). Usare il comando ''find'', ricordando che: per cercare solo file regolari l'opzione e' '-type f', per selezionare i file modificati entro 'X' minuti l'opzione da usare è '-mmin' (leggere attentamente l'entry nel manuale ''man 1 find''). Per cercare una parola all'interno di un file usare il comando ''grep'', l'opzione '-l' di ''grep'' permette di stampare il nome del file che ha dato il match. NOTA: si può aggiornare il tempo di modifica di un file tramite il comando ''touch'' ===== Esercizio 3 ===== Dati i file testuali contenuti in {{informatica:sol:laboratorio20:esercitazionib:results.tgz | questo}} tarball, ognuno dei quali contiene per ogni riga due campi separati da spazio ('id valore'). Scrivere uno script bash che legge il campo 'valore' di ogni file e ne calcola media e deviazione standard, quindi stampa sullo standard output una stringa con il seguente formato:\\ [nomedelfile senza estensione] [numero di linee del file] [media] [deviazione standard]. Un esempio di output per i due file test1.dat e test2.dat è: \\ test1 5 20.18 1.25\\ test2 3 11.20 .81\\ NOTA: per effettuare i calcoli in floating point usare il comando ''bc'' (esempio: echo "scale=2; sqrt(12)" | bc -q" stampa 3.46, cioe' la radice quadrata di 12 con troncamento a 2 cifre dopo la virgola). ===== Esercizio 4 ===== Dati i file testuali dell'esercizio precedente, scrivere uno script bash che legge i file testuali dell'esercizio precedente (specificando come argomento la cartella che li contiene), prende solo la parte **intera** dei valori, e scriva un file (il cui nome viene specificato come secondo argomento) che contiene i numeri in ordine crescente e senza duplicati. Il contenuto atteso del file prodotto è 0 1 10 11 18 19 20 21 1229 1231 1234 1237 (suggerimento: è possibile creare un file di appoggio in cui inserire i valori non ordinati. Si consiglia di guardare attentamente le opzioni dei comnandi ''sort'' e ''cut'', e si può inserire il comando ''tr -s " "'' nella pipeline per comprimere gli spazi duplicati.) ===== Esercizio 5 ===== Per questo esercizio utilizzare il sistema client-server dove il server trasforma le stringhe in upper case (ad es Esercitazione 9, esercizio 2), modificando il client in modo che prenda la parola (o più parole) come argomento del main, e stampi sullo standard output solamente il risultato (e.g., il comando ''./client_toupper ciao'' stampa CIAO su stdout e termina). Realizzare uno script bash che prende come argomento un file di testo in formato 'X.txt' (ad es, [[https://www.dropbox.com/s/nr5zqjhx2jccsyc/battiato.txt?dl=1|questo]]) e compie le seguenti operazioni: * invoca il makefile appropriato per assicurarsi che il client e server siano aggiornati * avvia il server (in background!) * per ogni parola nel file 'X.txt' avvia un'istanza del client (sempre in background) che capitalizza la parola, raccogliendo l'output di tutti i client nel file 'X-capital.txt' * una volta finito, termina il server (si possono utilizzare i comandi ''kill'' e ''pidof'') Data la natura asincrona e parallela del sistema non è importante l'ordine o la formattazione delle parole nel file di output. Se il client permette di ricevere più parole, è anche possibile passare un'intera riga all'istanza.