Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi N - Z > Sistemi operativi I
 
[LAB] Esercizi Shell Svolti
Clicca QUI per vedere il messaggio nel forum
Spr1gg4N
Ciao a tutti volevo proporre di creare un thread (questo :D) con su lo svolgimento degli esercizi di scripting proposti sul wiki (e perchè no, magari anche di altri) così da dare una mano a chi deve preparare il laboratorio.

Elenco degli esercizi proposti sul wiki:

*Trovare l'utente col minor numero di file nel sistema
* Trovare l'utente col file piu' recente nel sistema
* Elencare i tre utenti che hanno il maggior numero di file nel sistema
* Trovare tutti i file col numero dispari di righe (quindi sono i file di testo)
* Trovare tutti i file modificati di venerdi' (sia un venerdi' particolare che di venerdi' in generale)
* Trovare tutti i link simbolici nel filesystem
* Trovare tutti i file di testo che non siano script
* Contare quanti file di manuale ci sono nel filesystem
* A quante “pagine” (una pagina equivale a circa 1500 caratteri) corrispondono tutti i file di testo del filesystem?
* Quali file ha modificato l'utente XY in una specifica data?
* Quali file di testo ha modificato l'utente XY nell'ultimo anno?
* Qual'e' l'utente che ha modificato piu' file nell'ultimo anno?
* Calcolare il numero di righe totali che ha scritto sul filesystem un certo utente nell'ultimo mese
* Calcolare il rapporto tra il numero di file nel filesystem (o in una directory specificata) e lo spazio occupato
* Calcolare il rapporto tra il numero di file nel filesystem (o in una directory specificata) e lo spazio occupato ESCLUDENDO gli hardlink
* Quanta memoria occupa il processo piu' grande?

Spr1gg4N
Spero che qualcuno mi corregga se ho fatto qualche cavolata :D

* Trovare tutti i file col numero dispari di righe (quindi sono i file di testo)


code:
#!/bin/sh TEMP=temp echo "Calculating..." & (find / -type f | xargs wc -l 2>/dev/null | sed s/^\ *// > $TEMP) echo -e "LINES\t\tFILE" echo "--------------------------------------------" while read line; do LC=$(echo $line | cut -f 1 -d " ") NAME=$(echo $line | cut -f 2 -d " ") PAIR=$(expr $LC % 2) if [ $PAIR -ne 0 ]; then echo - e "$LC\t\t$NAME" fi done < $TEMP rm $TEMP


Ho utilizzato un file temporaneo altrimenti mi andava in "Out of space"....e direi anche giustamente dato che i file trovati da find / sono molti....ma la mia domanda è: è corretto fare in questo modo? Altrimenti ora come ora non saprei come farlo....
Se il find ritornasse pochi file allora avrei potuto anche fare solo un for che ciclava sui risultati del find....ma nel caso del find / questa è l'unica soluzione che mi viene in mente :D


* Trovare tutti i file di testo che non siano script

code:
#!/bin/sh TEMP="$(pwd)/temp" echo "Calculating..." & (find / -type f | grep -v '^'"$TEMP"'$' > $TEMP) while read line do FILE=$(echo $line) if [ "$(head -1 $FILE)" != "#!/bin/sh" ]; then echo $FILE fi done < $TEMP rm $TEMP


* Trovare tutti i link simbolici nel filesystem

code:
#!/bin/sh for LINK in $(find / -type l); do echo $LINK done


In questo script non è stato necessario utilizzare un file temporaneo perchè tanto i link simbolici che ho trovato sono solo 2.

*Trovare l'utente col minor numero di file nel sistema

code:
#!/bin/sh echo -e "USER\t\tUID\t\t#FiLES" echo "-----------------------------------------------" MINUSER=$(head -1 /etc/passwd | cut -f 1 -d : ) MINUID=$(head -1 /etc/passwd | cut -f 3 -d : ) MINFILES=$(find / -user $MINUID | wc -l) while read line; do USER=$(echo $line | cut -f 1 -d : ) UID=$(echo $line | cut -f 3 -d : ) if [ "$UID" -eq "$MINUID" ]; then echo -e "$MINUSER\t\t$MINUID\t\t$MINFILES" continue fi FILES=$(find / -user $UID | ec -l) fi [ "$MINFILES" -ge "$FILES" ]; then MINFILES=$FILES MINUSER=$USER MINUID=$UID fi echo -e "$USER\t\t$UID\t\t$FILES" done < /etc/passwd echo "\nMINORE:\n-----------------------------------------------" echo -e "$MINUSER\t\t$MINUID\t\t$MINFILES"


In questo esercizio stampo anche tutti gli utenti, i relativi UID e il relativo numero di files così da avere un riscontro col risultato finale (l'utente col minor numero di files)

* Elencare i tre utenti che hanno il maggior numero di file nel sistema

code:
#!/bin/sh TEMP="$(pwd)/temp" while read line; do USER=$(echo $line | cut -f 1 -d : ) UID=$(echo $line | cut -f 3 -d : ) FILES=$(find / -user $UID | wc -l) echo -e "$FILES $USER" >> $TEMP done < /etc/passwd sort -nr $TEMP | head -3 rm $TEMP

mark
* Trovare l'utente col file piu' recente nel sistema

non ho trovato di meglio per ora

code:
#!/bin/sh find / -type f -exec stat -atime {} \; > atime.tmp find / -type f -exec stat -uid {} \; > uid.tmp paste -d ' ' atime.tmp uid.tmp | sort +0 -n rm *.tmp

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate