| |
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 |
[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
|
|
|
|
|