Prova Pratica 2011.06.22

From Sistemi Operativi
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])