Difference between revisions of "Prova Pratica 2011.06.22"

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