Difference between revisions of "Prova Pratica 2011.06.22"

From Sistemi Operativi
Jump to navigation Jump to search
m (Migliorata organizzazione pagina)
 
Line 1: Line 1:
 +
==Esercizio 3==
 
<source lang="text">
 
<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.
 
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.
 
La stampa finale deve mostrare solamente il path relativo dei file.
 
</source>
 
</source>
==Soluzione di MV (bash)==
+
===Soluzione di MV (bash)===
 
<source lang="bash">
 
<source lang="bash">
 
SCRIPT=$0
 
SCRIPT=$0
Line 52: Line 53:
 
</source>
 
</source>
  
==Soluzione di MV (python)==
+
===Soluzione di MV (python)===
 
<source lang="python">
 
<source lang="python">
 
import sys
 
import sys

Latest revision as of 08:16, 9 May 2017

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])