Difference between revisions of "Prova Pratica 2011.06.22"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
|  (Created page with "<source lang="text"> 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 ...") | |||
| Line 49: | Line 49: | ||
| 	sort $FILE | cut --characters="$BEGIN-"	# riordino per data e stampo il nome | 	sort $FILE | cut --characters="$BEGIN-"	# riordino per data e stampo il nome | ||
| 	rm $FILE | 	rm $FILE | ||
| − | fi</source> | + | fi | 
| + | </source> | ||
| + | |||
| + | ==Soluzione di MV (python)== | ||
| + | <source lang="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]) | ||
| + | </source> | ||
Revision as of 08:20, 20 April 2015
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])