Prova Pratica 2011.06.22
(Redirected from Esercizio 3 Prova Pratica 22-06-2011)
Jump to navigation
Jump to search
Esercizio 3
Scrivere uno script bash o un programma python che metta in ordine tutti i file di un sottoalbero dal piu' vecchio al piu' recente.
La stampa finale deve mostrare solamente il path relativo dei file.
Soluzione di MV (bash)
SCRIPT=$0
# il primo script è lanciato con 1 parametro: directory
# le chiamate ricorsive son fatte con 2 parametri: directory file
if (( $# < 1 ))
then
echo "inserire il pathname di una directory come parametro"
exit 1
fi
if [ ! -d $1 ]
then
echo "`pwd`/$1 non esiste o non è una directory"
exit 1
fi
DIR=$1
if (( $# == 2))
then
FILE=$2 # gli script ricorsivi usano lo stesso file del chiamante
else
FILE=tmp$$ # lo script iniziale crea un file temporaneo
fi
# salvo nel file temporaneo le informazioni che mi interessano di tutti i file
for i in `ls $DIR`
do
if [ -f $DIR/$i ]
then
stat -c "%y %n" $DIR/$i >> $FILE
elif [ -d $DIR/$i ]
then
$SCRIPT $DIR/$i $FILE # chiamata ricorsiva
fi
done
# eseguito solo dal primo script (non da quelli ricorsivi)
if (( $# != 2))
then
BEGIN=37 # indica il primo carattere da stampare per ogni riga
# cioè tutti quelli prima indicano la data di modifica del file
sort $FILE | cut --characters="$BEGIN-" # riordino per data e stampo il nome
rm $FILE
fi
Soluzione di MV (python)
import sys
import os
if(len(sys.argv) != 1):
DIR = sys.argv[1];
else:
print("inserire il pathname di una directory come parametro")
exit(1)
if os.path.isdir(DIR):
os.chdir(DIR)
else:
print("percorso non valido")
exit(1)
# NOTA: DIR mantiene sempre il percorso relativo dalla directory passata come parametro
def scanTree(DIR,lista):
c = len(DIR)-1
if(DIR[c] == '/' and c != 0):
DIR = DIR[0:c]
for el in os.listdir(DIR):
el = DIR+"/"+el
if os.path.isdir(el):
scanTree(el, lista)
elif os.path.isfile(el):
mtime = os.stat(el).st_mtime
lista.append((mtime,el)); # memorizzo i file in una tupla (mtime, path)
lista = []
scanTree('.', lista)
lista.sort() #NB: le tuple vengono ordinate in base al loro primo elemento (mtime)
for i in lista:
print(i[1])